我们有两种方案:
- 建立联合索引(name,age),建立单列索引:age索引 。
- 建立联合索引(age,name),建立单列索引:name索引 。
这两种方案都能实现我们的需求,这个时候我们就要考虑空间了,name字段是比age字段大的,显然方案1所耗费的空间是更小的,所以我们更倾向于方案1 。
何时建立索引
- where中的查询字段
- 查询中与其他表关联的字段,比如外键
- 排序的字段
- 统计或分组的字段
- 表中数据量很少
- 经常改动的表
- 频繁更新的字段
- 数据重复且分布均匀的表字段(比如包含了很多重复数据,那此时多叉树的二分查找,其实用处不大,可以理解为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:在数据文件中读下一行的请求数 。如果你正进行大量的表扫描,该值较高 。通常说明你的表索引不正确或写入的查询没有利用索引 。
总结
- 索引简单来说就是一个排好序的数据结构,可以方便我们检索数据,而不需要盲目的进行全表扫描 。
- 索引底层有很多种实现结构,这篇主要只是讲解了BTREE索引,如果对树这一数据结构还不太熟悉的小伙伴,可以关注我后续数据结构专栏,会整理关于普通树,二叉树,二叉排序树的文章 。
- 索引分类:
- 主键索引
- 辅助索引
这里我们还扩展了索引下推,是一个十分重要的知识点,需要仔细回味 。
- 索引的相关设计原则,索引虽好,但也不可贪杯,不能为了用索引而建索引 。
- 索引的相关语法,很容易上手的 。
经验总结扩展阅读
- 我的世界怎么用附魔台附魔书(我的世界用高级附魔台怎么附魔)
- MySQL 索引失效-模糊查询,最左匹配原则,OR条件等。
- 30 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-番外篇
- MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?
- 轻奢极简店名美甲 名字高级小众美甲店名
- llinux下mysql建库、新建用户、用户授权、修改用户密码
- RedHat7.6安装mysql8步骤
- 我不完美但我独一无二签名 很高级酷酷的签名
- 29 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-终篇
- 究极无敌细节版 Mysql索引