【凡心往事】第025篇:面试手册之MySQL优化

【凡心往事】第025篇:面试手册之MySQL优化_第1张图片

先谈一谈mysql的整个查询执行过程,分为6个步骤

客户端向MySQL服务器发送一条查询请求

服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段

服务器进行sql解析、预处理、再由优化器生成对应的执行计划

MySQL根据执行计划,调用存储引擎的API来执行查询

将结果返回给客户端,同时缓存查询结

【凡心往事】第025篇:面试手册之MySQL优化_第2张图片

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

你可能感兴趣的:(【凡心往事】第025篇:面试手册之MySQL优化)