MySQL优化(五) SQL 语句的优化 索引、explain
一、索引
1、分类
(1)主键索引:当一张表的某个字段设置为主键时,该字段就是主键索引;
(2)唯一索引:索引列中的值必须是唯一的,但是允许为空值(可以存在多个null);
(3)普通索引:基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点;
(4)全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你真的是一个好人" 通过“一个好人”,可能就可以找到该条记录。
在模糊查询中使用全文索引:select * from user where match(name) against ('zhang') 格式: match(列名, ...) against ('搜索的关键字')。
全文索引中,有一个叫做停止词。因为在一个文本中,创建索引是一个无穷大的数,所以对一些常用词和字符,就不会创建索引,这些词被称为停止词。
2、查询索引
show index(es) from 表名
show keys from 表名
3、为什么建立索引之后查询速度变快?
因为索引使用了二叉树的数据结构,所以速度快;索引文件会占用磁盘空间;创建索引后进行增删改操作就会变慢,因为要重新调整二叉树;
二、索引使用的注意事项
1、在哪些列上适合添加索引?
(1)列比较频繁的作为查询条件,应该创建索引
(2)唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;
(3)更新非常频繁的字段不适合创建索引;
(4)不会出现在 WHERE 子句中字段不该创建;
2、索引的使用
(1)查询要使用索引最重要的条件是查询条件中需要使用索引;
(2)对于创建的多列索引,只要查询条件使用了索引中最左边的列,索引一般就会被使用;
(3)对于使用 like 的查询,查询如果是 '%aaa' 不会使用到索引,'aaa%' 会使用到索引。
3、不会使用索引的情况:
(1)如果条件中有 OR,即使其中有条件带索引也不会使用;
(2)对于多列索引,不是使用的最左边的列作为条件,则不会被使用;
(3)like 查询以 % 开头,不会使用索引;即在 like 查询时,查询的关键字前面不能使用% (或 _)这样的字符,如果一定前面有变化的值,则考虑全文索引。
(4)如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不会使用索引;
(5)如果Mysql 估计使用全表扫描要比使用索引快,则不使用索引;
三、通过 explain 语句分析,mysql 如何执行你的 sql 语句
explain查询sql执行计划,各列含义:
table:表名;
type:连接的类型
-system:表只有一行
-const:主键、索引。即表最多有一个匹配;
-eq_reg:主键、索引的范围查找;
-ref:连接的查找(join)
-range:索引的范围查找;
-index:索引的扫描;
-all:全表扫描;
possible_keys:可能用到的索引;
key:实际使用的索引;
key_len:索引的长度,越短越好;
ref:索引的哪一列被使用了,常数较好;
rows:mysql认为必须检查的用来返回请求数据的行数;
extra:using filesort、using temporary(常出现在使用order by时)时需要优化。
-Using filesort 额外排序。看到这个的时候,查询就需要优化了
-Using temporary 使用了临时表。看到这个的时候,也需要优化。