本文已参与「新人创作礼」活动,一起开启掘金创作之路。
索引优化
索引的优化肯定是落实到SQL语句的,那么我们首先要查看SQL的具体的执行频率,看是哪种语句执行的次数较多,从这方面入手。
SQL性能分析
方法1:
show session/global status -- 该命令可以查看CURD语句的访问频次
这时候我们就看到了具体是CURD哪种执行次数最多,但我们不知道是具体哪条SQL,这时候就用到了慢查询日志。
方法2:
慢查询日志记录了所有查询时间超过预设时间(默认10s)的所有SQL语句
方法3:
show profile 命令
方法4:
EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。
explain语句的关键字段
SQL提示
SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。(例如,一个字段上有单列索引、联合索引,这时候我们给出指定要走具体哪个索引)
前缀索引
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,浪费大量的磁盘IO,影响查询效率,此时可以将字符串前缀建立索引,这样可以大大节约索引空间,从而提高索引效率。
语法:create index idx_xxxx on table_name(columnn(n));
- n 代表前几位
- n的长度可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1
索引设计原则
- 针对于数据量较大,且查询比较频繁的表建立索引,而频繁更新的不适合索引
- 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引
- 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高(区分度不高的如性别)
- 如果是字符串类型的字段,字段长度较长,可以针对于字段的特点,建立前缀索引
- 尽量满足覆盖索引的情况
- 不要过度建立索引
- 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询