mysql进阶,索引的基础和优化

索引是什么:排好序的快速查找数据结构

索引语句

创建
CREATE INDEX indexName ON mytable(columnname(length));

ALTER mytable ADD INDEX ON (columnname(length))

删除
DROP INDEX ON mytable;

显示索引情况
SHOW INDEX FROM table_name

需要创建索引的情况:

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 查询中与其他表关联的字段,外键关系建立索引
  4. 频繁更新的字段不适合创建索引(每次更新不单单更新了记录还会更新索引,加重io负担)
  5. where条件里用不到的字段不创建索引
  6. 单值/组合索引选择问题(高并发下倾向创建组合索引)
  7. 查询中排序的字段,排序字段若通过索引区访问将大大提高排序速度
  8. 查询中统计或者分组字段

explian:查询sql的问题

mysql进阶,索引的基础和优化

explian属性的介绍

id:select查询的***。

  1. id相同,执行顺序由上到下
  2. id不同,如果是子查询,id的序号会递增,id值越大优先级越高
  3. id有相同有不同,相同,执行顺序由上到下。不同,,id值越大优先级越高

select_type:查询类型,主要用于区别普通查询、联合查询、子查询等的复杂查询
mysql进阶,索引的基础和优化

table:显示这一行的数据是关于哪张表的

type:使用哪种情况排序
mysql进阶,索引的基础和优化
最好到最差排序依次:
system>const>eq_ref>ref>range>index>ALL

一般优化至少达到range级别,最好达到ref

possible_keys:可能用到的索引

key:实际用到的索引

key_len:索引中使用的字节数,在保证精度的前提下,越短越好

ref:索引的那一列或常量被使用了

rows:找出记录所需读取的行数

extra:额外信息
其中比较重要的信息:
using filesort:mysql查询过程中使用了内部排序,查询中要避免出现。
using temporary:mysql查询过程中产生了临时表,查询中要避免出现。
using index 查询中使用了覆盖索引

覆盖索引:一个索引包含(或覆盖)所有需要查询的字段的值

索引优化

单表健索引:
多用用复合索引来取代单值索引

两表建索引:
小表建索引

三表建索引:
用小结果集驱动大结果集

索引失效:

mysql进阶,索引的基础和优化
小记:
带头大哥不能死,中间兄弟不能断,索引列上无计算,like%加右边,范围之后全失效,字符串里有引号