本文共 3066 字,大约阅读时间需要 10 分钟。
一、背景介绍
索引用来快速地寻找那些具有特定值的记录,如果没有索引,执行查询时Mysql必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录,表里面的记录数量越多,这个操作的代价就越高,如果作为搜索条件的列上已经创建了索引,mysql无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有一千个记录,通过索引查找记录至少要比顺序扫描记录快100倍。所以对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分。
二.知识剖析
1.MySQL都有哪些索引类型呢?
mysql提供多种索引类型供选择:普通索引,唯一索引,主键
全文索引,单列索引,与多列索引
2.普通索引
普通索引的唯一任务是加快对数据的访问速度,因此,应该只为那些最经常出现在查询条件(WHERE column=)或者排序条件(ORDERBY column)中的数据列创建索引
3.主键
必须为主键字段创建一个索引,这个Mysql索引就是所谓的“主索引”。主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是PRIMARY而不是UNIQUE
4.唯一性索引
如果确定某个数据列只包含彼此各不相同的值,在为这个数据列创建索引的时候,就应该用关键字UNIQUE把它定义为一个唯一索引,Mysql会在有新纪录插入数据表时,自动检查新纪录的这个字段的值是否已经在某个记录的这个字段里出现过了。如果是,mysql将拒绝插入那条新纪录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复
5.索引的优点
5.1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性
5.2.建立索引可以大大提高检索的数据,以及减少表的检索行数
5.3.在表连接的连接条件,可以加速表与表直接的相连
5.4.在分组和排序字句进行数据检索,可以减少查询时间中分组和排序时所消耗的时间(数据库的记录会重新排序)
5.5.建立索引,在查询中使用索引,可以提高性能。
6.索引的缺点
6.1.创建索引和维护索引,会耗费时间,随着数据量的增加而增加
6.2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
6.3.当对表的数据进行INSERT,UPDATE,DELETE的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件)。
三.常见问题
1.如何创建索引
2.隐式类型转换对MySQL选择索引的影响。
3.什么情况下建索引。
4.什么情况不建索引。
5.索引对查询提高多少性能?
四.解决方案
1.SQL插入索引语句。
1.1普通索引:ALTER TABLE'table-name' ADD INDEX index_name('column')
1.2唯一索引:ALTER TABLE'table-name' ADD UNIQUE('column')
1.3主键索引:ALTER TABLE'table-name' ADD PRIMARY KEY ('column')
2.当文本字段与数字进行比较时,由于类型不同,MySQL需要做隐式类型转换才能进行比较。
默认转换规则是:不同类型全都转换为浮点型m,如果字段是字符,条件是整型,那么会把表中字段全都转换成整型
3.1.在经常需要搜索的列上,可以加快索引的速度
3.2主键列上可以确保列的唯一性(手机号,身份证号,银行卡号)。
3.3在表与表的而连接条件上,加上索引,可以加快连接查询的速度。
3.4.在经常需要排序(order by)分组(group by)和distinct列上加索引可以加快排序查询的时间,(单独order by用不了索引,索引考虑加where或者加limit)
3.5.尽量选择区分度高的列作为索引。
3.6.索引列不能参与计算,保持列“干净”。
3.7.尽量的扩展索引,不要新建索引。
4.1.查询中很少使用到的列,不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求。。
4.2很少数据的列也不应该建立索引,比如一个性别字段0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率。
4.3定义为text和image和bit数据类型的列不应该增加索引。
4.4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作时互斥的关系。
5.见运行编码效果
五。编码实战
七、参考文献
百度,书籍
八.更多讨论
1.MySQL索引方法有几种?
答:MySQL目前主要有以下几种索引方法:B-Tree,Hash,R-Tree。
2.B-Tree和Hash的区别是什么?
答: 1、B-Tree
B-Tree是最常见的索引类型,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。所以B-Tree适合用来查找某一范围内的数据,而且可以直接支持数据排序(ORDER BY)
B-Tree在MyISAM里的形式和Innodb稍有不同:
MyISAM表数据文件和索引文件是分离的,索引文件仅保存数据记录的磁盘地址
InnoDB表数据文件本身就是主索引,叶节点data域保存了完整的数据记录
2、Hash索引
2.1.仅支持"=","IN"和"<=>"精确查询,不能使用范围查询:
由于Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的Hash算法处理之后的Hash
2.2.不支持排序:
由于Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算
2.3.在任何时候都不能避免表扫描:
由于Hash索引比较的是进行Hash运算之后的Hash值,所以即使取满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果
2.4.检索效率高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash索引的查询效率要远高于B-Tree索引
2.5.只有Memory引擎支持显式的Hash索引,但是它的Hash是nonunique的,冲突太多时也会影响查找性能。Memory引擎默认的索引类型即是Hash索引,虽然它也支持B-Tree索引
3.为什么索引类型不一样,但不同类型的索引方式还是B-Tree和Hash呢?
百度找不到答案,师兄们也不知道,咋整?暂时存疑。
4.不通过SQL语句,在java里面怎么创建索引?
用两个Map搞定
Map wenjname=new HashMap();///索引是数字,内容是文件名
Map dcjc=new HashMap();///索引是单词,内容是上面的索引
一个Map的话,也可以但是我觉得很费资源啊
作者:素履之往_3e36 链接:https://www.jianshu.com/p/dd4fe101cffe 來源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。