# Mysql
# Mysql和SQLite区别
- SQLITE功能简约,小型化,追求最大磁盘效率
- MYSQL功能全面,综合化,追求最大并发效率。 如果只是单机上用的,数据量不是很大,需要方便移植或者需要频繁读/写磁盘文件的话,就用SQLite比较合适;如果是要满足多用户同时访问,或者是网站访问量比较大是使用MYSQL比较合适。
# 对比 InnoDB 和 MyISAM
InnoDB 和 MyISAM 是 MySQL 中常用的两种存储引擎。
InnoDB:InnoDB 是 MySQL 默认的事务性引擎,也是最重要和使用最广泛的存储引擎。它被设计成为大量的短期事务,短期事务大部分是正常提交的,很少被回滚。InnoDB 的性能与自动崩溃恢复的特性,使其在非事务存储需求中也非常流行。除非有特别的原因需要使用其他的存储引擎,否则应该优先考虑 InnoDB 引擎。
MyISAM:在 MySQL 5.5 及之前版本,MyISAM 是默认引擎。MyISAM 提供大量特性,包括全文索引,压缩,空间函数 等,但 MyISAM 不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复。正是由于 MyISAM 的缘故,即使 MySQL 已经支持事务很长时间,很多人的概念里还认为 MySQL 不支持事务。尽管这样,MyISAM 并不是一无是处。对于只读的数据,或者表比较小,可以忍受修复操作,依然可以使用 MyISAM。
总结几个区别:
- InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要因素。
- InnoDB 支持外键,MyISAM 不支持。对一个包含外键的 InnoDB 表转换为 MyISAM 会失败。
- InnoDB 是聚簇索引,而 MyISAM 是非聚簇索引。聚簇索引的文件放在主键索引的叶子结点上,因此 InnoDB 必须要有主键,而且通过主键索引效率很高。而 MyISAM 是非聚簇索引,数据文件和索引是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的。
- InnoDB 不保存表的具体行数,执行
select count(*) from table时需要全表扫描,而 MyISAM 用一个变量保存了整个表的行数,执行上述语句只需要读出该变量即可,很快。 - InnoDB 的最小锁粒度是行级锁;MyISAM 是表级锁,一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限,这也是 MySQL 将默认存储引擎换成 InnoDB 的重要原因。
再看看如何选择:
- 是否要支持事务。如果需要支持事务,请选择 InnoDB。
- 如果表中绝大多数操作都是只读查询,可以考虑 MyISAM;如果既有读写也挺频繁,请使用 InnoDB。
- 系统崩溃后,MyISAM 恢复更难,能否接受这一一点。
- MySQL 5.5 后 InnoDB 已经成为 MySQL 的默认引擎(之前是 MyISAM),说明其优势是有目共睹的。如果不知道用什么存储引擎,就用 InnoDB。
# Mysql 远程访问问题
- 设置
bind_address。
首先要确保 [mysqld]中bind_address 参数设置为 0.0.0.0(或者直接注释掉这一行)。
在 Ubuntu 16.04 + Mysql 5.7 搭配中,该参数的配置位于 /etc/mysql/mysql.conf.d/mysqld.cnf中。
检查这一步做好的方法就是通过 netstat -tunlp | grep mysql 的方式来确认 mysqld 进程绑定的地址是 0.0.0.0 而不是 127.0.0.1。
- 设置用户权限。
首先我们可以查看当前数据库中用户在不同IP地址下的访问情况。
mysql> use mysql;
Database changed
mysql> select host, user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| localhost | debian-sys-maint |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+------------------+
以上信息说明,对于 root 用户,现在只能在 localhost 下访问。
现在假设我们要对 root 用户赋予所有所有IP下的访问权限,则可以在 Mysql 中运行以下命令
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
接下来我们再通过以上命令查看用户的访问情况
mysql> select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | root |
| localhost | debian-sys-maint |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+------------------+
证明 root 用户 已经可以在外部所有IP下进行访问了。