这边总结一下mysql在使用过程中比较常见的优化小技巧,比较不好理解的都加了小例子
1、当使用索引列进行查询的时候尽量不要使用表达式,可以把计算放在业务层,而不是数据库层
错误例:
select actor_id from actor where actor_id+1=5;
2、尽量使用主键查询,而不是其他索引,因为主键查询不会触发回表查询
3、使用前缀索引
字段长度比较长的时候,截取部分识别度高的部分当索引
想要详细了解的可以看我文章mysql前缀索引--带案例分析
4、使用索引扫描来排序
5、union all、in、or都能够使用索引,推荐使用in
6、范围列可以用到索引
范围条件是:<、<=、>、>=、between
范围列可以用到索引,但范围列后面的列无法用到索引,索引最多用于一个范围列
7、强制类型转换会导致全表扫描
例如user表中的phone是varchar类型的
explain select * from user where phone=13800001234;不会触发索引
explain select * from user where phone=‘13800001234‘;加入引号之后触发索引
8、更新十分频繁、数据区分度不高的字段不宜建立索引
更新会变更B+树,更新频繁的字段建立索引会大大降低数据库的性能(叶子节点插数据,合并分裂会导致n多的io)
区分不大的属性,例如性别,建立索引没有什么意义,不能够有效的过滤数据,一般区分度要在80%以上的列才适合建立索引
区分度计算:count(distinct(列名))/count(*)
9、创建索引的列,不允许为null,可能会得到不符合预期的结果。业务中不能为null的字段
10、当需要进行表连接的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致(最好是索引列)
11、能使用limit尽量使用limit,避免过多无效扫描
12、单表索引建议控制在五个以内,索引会占用内存空间
13、单索引字段不允许超过五个(组合索引,最左匹配原则)
14、创建索引的时候避免以下错误概念
索引越多越好,索引多了占内存
过早优化,要在熟悉业务之后再优化