一、索引
索引: 一种排序的数据结构(Btree索引、Hash索引、full-text全文索引、R-Tree索引)
作用: 协助快速查询、更新数据表的数据
单值索引:一个索引只包含单个列,一个表可以有多个单个索引
唯一索引:索引列的值必须唯一,但允许有空值
复合索引:一个索引包含多个列
二、索引语法
CREATE  [UNIQUE] INDEX index_name ON table_name (columname(length))   
ALTER TABLE tbl_ name ADD PRIMARY KEY (column_list):该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_ name ADD UNIQUE index_name (column_list):创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
ALTER TABLE tbl_ name ADD INDEX index_name (column_list):添加普通索引,索引值可出现多次。
ALTER TABLE tbL_ name ADD FULLTEXT index_name (column_list)指定了索引为FULLTEXT,用于全文索引。
三、索引情况
- 频繁作为查询条件的字段应该创建索引
- 频繁跟新的字段不适合创建索引(因为不仅更新字段,还要跟新索引)
- where条件用不到的字段不用创建索引
- 高并发情况下倾向组合索引
- 查询中的排序字段,将大大提高排序速度
- 查询中统计或分组字段

- 表记录太小
- 经常增删改的表(提高查询速度,降了更新速度 不仅保存数据,还要跟新索引)
- 数据重复的内容 (效果不大)
四、索引优化
  • 查看SQL语句的执行计划,查看该SQL语句有没有使用索引,有没有做全表扫描,获得可能被优化器考虑到的访问策略的细节,

mysql-索引创建、优化分析、索引优化_字段

  • ID
  • id相同,执行顺序由下而上(t2–>t3–>t1)
  • id不同,如是子查询,id号会递增;id值越大则优先级越高越先执行(t3–>t1–>t2)
  • - select_type
  • SIMPLE 简单的select查询,查询中不包含子查询或者UNION
  • PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
  • SUBQUERY 在SELECT或WHERE列表中包含了子查询
  • DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中
  • UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
  • UNION RESULT 从UNION表获取结果的SELECT
  • type

    最好到最差依次是:system > const > eq_ref > ref > range > index > all
    ​all 全表扫描​​ 非常暴力和原始的查找方法,非常的耗时而且低效,有很大的优化空间。
  • S学校有俩万人,我告诉你你给我找到小明,然后你怎么做呢!你当然是把全校俩万人挨个找一遍,即使你很幸运第一个人便找到了小明,但是你仍然不能停下,因为你无法确认是否有另外一个小明存在,直到你把俩万人找完为止

​index 按 照索引顺序 全表扫描​​​​range 有范围的索引扫描​​,相对于index的全索引扫描,它有范围限制,因此要优于index
​ref_eq 结果集只有一个,使用主键或者唯一性索引进行查找的情况 精确查询,无需过多的扫描​

  • 比如根据学号查找某一学校的一名同学,在没有查找前我们就知道结果一定只有一个,所以当我们首次查找到这个学号,便立即停止了查询

​const 将一个主键放置到where后面作为条件查询​​,mysql优化器就把查询优化转化为一个常量。至于如何转化以及何时转化,这个取决于优化器

  • possible_keys 可用能使用的索引,不一定被查询时使用
  • key 列显示MySQL实际使用的索引;没有选择索引键是NULL
  • key_len 索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度)
    不损失精确性的情况下,长度越短越好
  • rows 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数