牵引

1:普通索引:仅加速查询
create {unique|fulltext|spacial} index 索引名称 {btree|hass} on 表名称 (字段1, 字段2...)
1)create index name_and_age on students (name,age);
(2)drop index name_and_age on students;
(3)alter table students add index age (age);
(4)alter table students drop index age;
(5)alter table students add primary key (id);
(6)alter table students drop primary key;

2:唯一索引:加速查询 + 列值唯一(可以有null)

3:主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null)

4:组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

5:全文索引:对文本的内容进行分词,进行搜索
  • 索引类型(show engines; 可以查看数据库支持的所有的存储引擎)
(一)B-TREE 索引:顺序索引,每一个叶子节点到根节点的距离是相同的,左前缀索引,适合查找范围内的数据 
适合B-tree索引的查询类型有:全键值,键值范围或键左前缀查找
全值匹配:精确查找某个值
最左前缀匹配:只精确匹配起头部分,'Qcache%'
匹配范围值:id > 1

不适合使用B-tree索引的场景
如果查找不是最左侧开始,索引无效
如果查询中某个列是范围查询,那么其右侧的列都无法再次使用索引优化查询


(二)Hash索引:基于哈希表,特别适用于精确匹配索引中的所有列,但是只有memory存储引擎支持显示hash索引
适应场景:只支持值的比较,例如: id > 1
不适用场景:模糊匹配查询、顺序查询

(三)空间索引(SPATIAL):指依据空间对象的位置和形状或空间对象之间的某种空间关系按一定的顺序排列的一种数据结构
MyISAM支持空间索引

(四)全文索引(FULLTEXT):用于在文本中查找关键词
MyISAM支持全文索引

  • 索引优化策略
1:独立使用列,尽量避免其参与运算
2:左前缀索引:查询字段的时候,条件过滤时,最左前缀精确匹配
3:多列索引:AND 连接字段时适合多列索引;选择合适的索引次序,将选择性最高的放在左侧,范围匹配的放在右侧
  • 索引的调优可以使用explain进行分析
explain select id,name from students where name = 'yhy%'G

id: 1 # 当前程序语句中每个select语句的编号
select_type: SIMPLE # 查询类型,简单类型为simple,复杂类型为:subquery(子查询),derived(用户from中的子查询) union(union语句的第一个之后的select语句)union select(匿名临时表)
table: student1 # 查询关联到的表
type: ref # 关联类型,或访问类型mysql如何查找表中的行的方式,all(全表扫描) index(根据索引的次序进行全表扫描,如果在extra列出现using index表示覆盖索引)range(服务扫描,有限制的根据索引实现的范围扫描,扫描位置为索引的某一点到另一点结束)ref(根据索引,返回表中所有匹配单个值的行) eq_ref(仅仅返回一行,但需要与某个参考值做比较) const或system(直接返回单个行,效果最佳)
possible_keys: name_age_unique # 查询可能会用到的索引
key: name_age_unique # 查询使用到的索引
key_len: 752 # 使用到索引中使用的字节数
ref: const # 在利用key字段所表示的索引进行查询所用的列或某个常量值
rows: 3 # mysql估计找到目标行所读取的行数
Extra: Using where # 额外信息,如 using index(使用覆盖索引) using where (mysql服务器将在存储引擎内存层再进行过滤)using temporary(mysql对结果排序会使用临时表) using filesort(在磁盘创建临时表或内存中排序)
  • 查看表的状态
1:show table status
2:show table status like 'students'G
原文地址:https://www.cnblogs.com/liu1026/p/7467668.html