MySQL 相信大家一定都不陌生,但是不陌生不一定会用!会用不一定能用好!
今天,就跟大家一起复习一个高频面试考点,SQL 优化有哪些技巧?
1、创建索引
一定要记得创建索引
执行没有索引的 SQL 语句,肯定要走全表扫描,慢是肯定的。
MySQL 为了提升数据查询速率,采用 B+ 树结构,通过空间换时间 设计思想。另外每次对表数据做更新操作时,都要调整对应的 索引树 ,执行效率肯定会受影响。
阿里巴巴的开发者手册建议,单表索引数量控制在 5 个以内,组合索引字段数不允许超过 5 个。
其他建议:
禁止给表中的每一列都建立单独的索引。
每个 Innodb 表必须有个主键。
要注意组合索引的字段的顺序。
优先考虑覆盖索引。
避免使用外键约束。
2、避免索引失效
不要以为有了索引,就万事大吉。
殊不知,索引失效 也是慢查询的主要原因之一。
常见的索引失效的场景有哪些?
以 % 开头的 LIKE 查询。
创建了组合索引,但查询条件不满足 '最左匹配原则'。如:创建索引 idx_type_status_uid(type,status,uid),但是使用 status 和 uid 作为查询条件。
查询条件中使用 or,且 or 的前后条件中有一个列没有索引,涉及的索引都不会被使用到。
在索引列上的操作,函数 upper() 等,or、!= (<>)、not in 等。
3、锁粒度
MySQL 的存储引擎分为两大类:MyISAM 和 InnoDB。
MyISAM 支持表锁;InnoDB 支持行锁和表锁。
更新操作时,为了保证表数据的准确性,通常会加锁,为了提高系统的高并发能力,我们通常建议采用 行锁,减少锁冲突、锁等待 的时间。所以,存储引擎通常会选择 InnoDB。
4、分页查询优化
个人建议:先定位到上一次分页的最大 id,然后对 id 做条件索引查询。由于数据库的索引采用 B+ 树结构,这样可以一步到位
5、避免 select *
MySQL 创建表后,具体的行数据存储在主键索引(属于聚簇索引)的叶子节点。
二级索引属于非聚簇索引,其叶子节点存储的是主键值。