「MySQL高级篇」MySQL索引原理,设计原则( 六 )

我们有两种方案:

  1. 建立联合索引(name,age),建立单列索引:age索引 。
  2. 建立联合索引(age,name),建立单列索引:name索引 。
?
这两种方案都能实现我们的需求,这个时候我们就要考虑空间了,name字段是比age字段大的,显然方案1所耗费的空间是更小的,所以我们更倾向于方案1 。
何时建立索引
  1. where中的查询字段
  2. 查询中与其他表关联的字段,比如外键
  3. 排序的字段
  4. 统计或分组的字段
何时达咩索引
  1. 表中数据量很少
  2. 经常改动的表
  3. 频繁更新的字段
  4. 数据重复且分布均匀的表字段(比如包含了很多重复数据,那此时多叉树的二分查找,其实用处不大,可以理解为O(logn)退化了)
索引相关语法创建索引
默认会为主键创建索引--primary
CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEX index_name[USINGindex_type]ON tbl_name(index_col_name,...)index_col_name : column_name[(length)][ASC | DESC]查找索引
结尾加上\G,可以变成竖屏显示
select index from tbl_name\G;删除索引drop INDEX index_name on tbl_name ;变更索引1). altertabletb_nameaddprimarykey(column_list); 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL 2). altertabletb_nameaddunique index_name(column_list); 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)3). altertabletb_nameaddindex index_name(column_list); 添加普通索引,索引值可以出现多次 。4). altertabletb_nameaddfulltextindex_name(column_list); 该语句指定了索引为FULLTEXT,用于全文索引查看索引使用情况show status like 'Handler_read%';-- 查看当前会话索引使用情况show global status like 'Handler_read%'; -- 查看全局索引使用情况Handler_read_first:索引中第一条被读的次数 。如果较高,表示服务器正执行大量全索引扫描(这个值越低越好) 。?
Handler_read_key:如果索引正在工作,这个值代表一个行被索引值读的次数,如果值越低,表示索引得到的性能改善不高,因为索引不经常使用(这个值越高越好) 。?
Handler_read_next :按照键顺序读下一行的请求数 。如果你用范围约束或如果执行索引扫描来查询索引列,该值增加 。?
Handler_read_prev:按照键顺序读前一行的请求数 。该读方法主要用于优化ORDER BY ... DESC 。?
Handler_read_rnd :根据固定位置读一行的请求数 。如果你正执行大量查询并需要对结果进行排序该值较高 。你可能使用了大量需要MySQL扫描整个表的查询或你的连接没有正确使用键 。这个值较高,意味着运行效率低,应该建立索引来补救 。?
Handler_read_rnd_next:在数据文件中读下一行的请求数 。如果你正进行大量的表扫描,该值较高 。通常说明你的表索引不正确或写入的查询没有利用索引 。
总结
  1. 索引简单来说就是一个排好序的数据结构,可以方便我们检索数据,而不需要盲目的进行全表扫描 。
    • 索引底层有很多种实现结构,这篇主要只是讲解了BTREE索引,如果对树这一数据结构还不太熟悉的小伙伴,可以关注我后续数据结构专栏,会整理关于普通树,二叉树,二叉排序树的文章 。
  2. 索引分类:
    1. 主键索引
    2. 辅助索引
这里我们还扩展了索引下推,是一个十分重要的知识点,需要仔细回味 。
  1. 索引的相关设计原则,索引虽好,但也不可贪杯,不能为了用索引而建索引 。
  2. 索引的相关语法,很容易上手的 。

    经验总结扩展阅读