【凡心往事】第025篇:面试手册之MySQL优化
先谈一谈mysql的整个查询执行过程,分为6个步骤
客户端向MySQL服务器发送一条查询请求
服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段
服务器进行sql解析、预处理、再由优化器生成对应的执行计划
MySQL根据执行计划,调用存储引擎的API来执行查询
将结果返回给客户端,同时缓存查询结
1、优化Sql语句
只要能满足需求,应尽可能使用更小的数据类型
避免使用select *查询,*替换成具体要查询的列
避免在where子句进行null值判断
避免在where子句中使用!=或<>操作符
IN、OR子句会使索引失效
任何对列的操作都将导致表扫描,包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
like子句使用前置百分号也会导致索引失效
2、设计合适的索引
较频繁作为查询条件的字段才去创建索引
对经常用作group by的关键字段做索引
索引并不是越多越好,索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度。
数据量太少的表不需要建索引。
3、加缓存
memcached、redis
4、主从复制、读写分离(以上都做了,还是慢的时候)
5、先用mysql自带分区表(以上都做了还是慢的时候)
6、垂直拆分(以上都做了还是慢的时候)
根据你模块的耦合度,将一个大的系统分为多个小的系统。
7、最后才是水平切分
选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余。sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表。
参考资料
https://www.zhihu.com/question/19719997
https://juejin.im/post/5aa7703c6fb9a028c8128739
https://juejin.im/entry/590427815c497d005832dab9