MySQL索引以及优化手段
不走索引的情况:
- 索引列参与计算
- 索引列使用了函数
- 索引列使用了Like %XXX,前缀走索引,后缀不走索引
- 字符串列与数字直接比较,存在隐式强制转换
- 不满足最左匹配原则也不会走索引
MySQL优化手段
- show status like 'com_%'得到各种SQL的执行频率
- Slow queries log 得到慢查询日志,知道哪些命令执行的慢
- 通过explain +sql语句得到一条语句执行需要扫描多少行,且其type是什么(ALL,index,range等)
- 通过show profile得到最近15条sql的执行记录
- show profile (cpu) for query得到该记录的详细执行报告,在每个操作上耗时。
- 建立相关的索引提升速度
- 常用的查询字段最好建立索引
- 索引建立的时候最好选择重复少的字段
- 索引建立的时候最好实现覆盖索引
- 不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
- 对字符串的相关字段实现索引的时候可以使用前缀索引 alter table table_name add key(column_name(length));
- 索引太多也可能导致插入删除效率低
优化SQL语句
插入的时候尽量一次插入数据,不要分成几次完成
oder by语法尽量建立在可以使用索引的情况下完成,如果实在不行,则select的时候只选择最需要的字段,别用*,因为mysql会对数据进行排序,如果数据量小的话可以在内存中完成,速度更快。消耗更多的 CPU 和 IO 以网络带宽资源,无法使用覆盖索引,可减少表结构变更带来的影响
group by默认会对键值排序,如果不需要可以关闭,也就是order by null
嵌套查询的时候最好换成join连表查询,因为join不用在内存中创建临时表
创建索引:
1.alter table "table_name" add primaty key() / key / index / unique
mysql的三种日志:
- redolog:记录的是物理变化,用于实现ACID的D(durability)持久性,每次更新数据库先实现redolog,然后再刷新到磁盘,如果断电可以从redolog回复,redolog是顺序写速度比直接改磁盘数据快
- binlog:mysql自带的,不区分引擎,主要用于主从复制,记录的是逻辑变化,可以理解为每次的插入删除更新的sql语句,主服务器更新数据后,从服务器定期从主服务器的binlog中更新数据
- undolog:记录的是每次更新语句的反向语句,也就是可以抵消这次更新的语句。主要用于回滚操作,也就是ACID的A实现,并且undolog还可以实现mysql的MVCC多版本并发控制的快照读操作。
MySQL三种日志详解