MySQL索引优化

索引设计使用原则

为了提升数据检索速度,降低查询延时和IO消耗,在建表或者编写SQL语句时,应该首先设计及检查索引和数据分布情况,下面是常见的索引设计或使用原则:

尽量选择惟一性索引;

为经常需要排序、分组和联合操作的字段建立索引;

为常作为查询条件的字段建立索引;

限制索引的数目,索引越多,更新和插入的效率越低;

尽量使用数据量少的索引;

组合索引中的尽量把能过滤掉更多数据的字段放在前面;

尽量使用前缀来索引,针对长文本,TEXT等类型;

删除不再使用或者很少使用的索引;

数据是动态变化中的,索引的使用也需要根据数据的变化而变化。

show processlist 命令

输入show processlist命令后可以看到数据库中所有连接中的session,以及相应SQL的执行情况,如下图所示:


MySQL索引优化_第1张图片
图片.png

其中:

id是session id,可以使用kill xxxx 的方式来杀死session;

user,host,db是session操作的用户,主机和数据库;

command是命令类型;

info是详细的SQL语句;

time是相应命令执行时间;

state是命令执行状态。

这里面最重要的是time和state,大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。

而根据state可以判断执行慢的问题在哪里,相应state含义对照表见下表。

MySQL索引优化_第2张图片
图片.png

Explain 命令

在所执行的SQL前加explain命令,即可查看相应SQL的执行计划,例如一个很简单的like查询,是否使用了索引,可以通过possible_keys和rows很容易能看出来。

图片.png

图片.png

对于一个复杂的SQL来说,往往explain会有多行数据,相关列字段见:https://www.cnblogs.com/xiaoboluo768/p/5400990.html

索引设计及使用规范

建表时,就要根据规划中不同表的用途和查询方式建立合适的索引;

编写SQL时,要清楚的知道表都有哪些索引,如何才能最大化的利用索引查询,降低查询速度,尤其是数据量超大(超过100万条),或者需要进行多表关联时,本条规则就尤其重要;

SQL编写后,要养成使用explain命令查看索引使用情况的习惯,避免一些本应该使用索引的SQL并没有使用索引,或者因为数据问题,使用索引可能还没有不用来的快;

定时查看数据库执行情况,使用show processlist或者开启慢查询,查看慢查询日志,分析执行效率低的SQL;

当发生数据查询慢,或者数据库IO开销很高的情况,要学会使用show processlist或show full processlist命令查看数据库当前在做什么,哪些SQL执行慢,问题出现在哪里,等等。

你可能感兴趣的:(MySQL索引优化)