一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。请记住记住这一点:索引是一种数据结构。
因此,首先你要明白的一点就是,索引它也是一个文件,它是要占据物理空间的。
这个在MySQL目录下可以找到,比如:C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql
比如对于MyISAM
存储引擎来说:.frm
后缀的文件存储的是表结构。.myd
后缀的文件存储的是表数据。.myi
后缀的文件存储的就是索引文件。
对于InnoDB
存储引擎来说:.frm
后缀的文件存储的是表结构。.ibd
后缀的文件存放索引文件和数据(需要开启innodb_file_per_table
参数)
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
另外
CREATE INDEX可对表增加普通索引或UNIQUE索引。
注意:
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
如果有可视化MySQL客户端,可以较为清晰的看到索引类型(我用的navicat)
全文索引主要用于海量数据的搜索,比如淘宝或者京东对商品的搜索,你不可能使用like进行模糊匹配吧,MySQL从5.6开始支持InnoDB引擎的全文索引,功能没有专业的搜索引擎比如Sphinx或Solr丰富,如果你的需求比较简单,可以尝试一下MySQL的全文索引,否则建议使用专业的搜索引擎。
普通索引的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHERE column=)或排序条件(ORDER BY column)中的数据列创建索引。
空间索引可用于地理数据存储,它需要GIS相关函数的支持,由于MySQL的GIS支持并不完善,所以该索引方式在MySQL中很少有人使用。
确保了数据的唯一性,比如学生的的姓名可能会重复,但是学号绝不可能重复,这时候就可以给学号加上唯一索引
事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
先用客户端看一下有几种方法
B-Tree索引是最常用的一种索引,如果没有指定特定的类型,那么多半就是B-Tree索引。
绝大多数的存储引擎,比如MyISAM和InnoDB都支持这种索引,因此说它是应用最广泛,最常用的一种索引方式,但是不同的存储引擎在具体实现时会稍有不同,比如MyISAM会使用前缀压缩的方式对索引进行压缩,InnoDB则不会。
下图展示了B-Tree索引是如何存储被索引的数据的:
说明:
相比于B-Tree索引,哈希索引的实现就比较简单了,它是基于哈希表来实现的,对于要索引的列,存储引擎会计算出一一对应的哈希码,然后把哈希码存放在哈希表中作为key,value值是指向该行数据的指针。
下图是简单的原理展示:
说明:
左边紫色图表示一个二列的数据表。
中间表示对fname列进行哈希索引,计算出哈希值。
右边绿色图表示把生成的哈希值存放于哈希表中。
当我们执行以下查询时:
select * from testTable where fname = "mary";
MySQL会首先计算查询条件mary的哈希值,然后到哈希表中去找该哈希值,如果找到了根据对应的指针也就找到了需要寻找的数据行。
哈希表的优势与限制:
优点:
缺点:
因此,哈希索引虽然速度快,但其实使用很受限,只适用于某些特殊的场合。
1、如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
如:
2、like查询是以%开头
3、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
4、如果mysql估计使用全表扫描要比使用索引快,则不使用索引
5、对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)
6、使用 <> 、not in、not exist、!=
比如
select id from t where num in(1,2,3);
7、索引字段进行判空查询时。也就是对索引字段判断是否为NULL时。语句为is null 或is not null。
对于多列索引,总是从索引的最前面字段开始,接着往后,中间不能跳过。
比如列索引(a,b,c)创建的同时,已经对(a)、(a,b)、(a,b,c)上建立了索引,中间不能跳过,比如(a,c)就不行。
但是内部顺序不要求一定按照顺序来,因为MySQL会自动优化,比如说(a,b)写成(b,a)也没问题
原文:https://www.cnblogs.com/GotoJava/p/13675110.html