mysql的索引

Posted 井盖同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的索引相关的知识,希望对你有一定的参考价值。

索引的概念

索引用于快速找出在某个列中有一特定值的行,不使用索引,mysql必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。索引相当于建立了一个数据的目录,存放的是数据所在的位置

索引的优缺点和使用原则 

优点: 

1、所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引 

2、大大加快数据的查询速度

缺点:

1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

使用原则:

通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。

1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引where条件后的经常使用的查询字段

2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。

作用总结:增加了查询的速度,但是影响了增删改的操作速度。

索引的原理

Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。

B+Tree索引:又叫二叉树

比如我有1、2、3、4、5、6、7、8、9这些数据

btree的查询原理

哈希索引的原理:

精确匹配到索引列的查询。对于每一行数据,存储引擎都会对所有的索引列计算出一个哈希码(hash code),哈希码是一个较小的整数值,并且不同键值的行计算出来的哈希码也不一样。

简单的例子,家里的物品,根据重量的不同,利用弹簧秤弹到不同的位置,下次再找物品时,可以拿一个与目标物品重量相同的物品,放到弹簧秤,弹到的位置就是要找的物品的位置。弹簧秤就相当于一个哈希算法。

索引的分类

普通索引、主键索引、唯一索引、全文索引

普通索引:仅仅是加快查询速度

唯一索引:不仅加快查询速度,该列的值不能重复

主键索引:主键不能重复且不能为空      主键必唯一,但是唯一索引不一定是主键,一张表上只能有一个主键,但是可以有一个或多个唯一索引

全文索引:fulltext  用于在一篇文章中,检索文本信息的。主要用来优化like语句的,因为like语句会一行一行的查找匹配值,查询效率慢

查看一张表上的索引

 

添加索引

添加主键索引: ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 

添加唯一索引:ALTER TABLE `table_name` ADD UNIQUE (`column`)

添加普通索引:ALTER TABLE `table_name` ADD INDEX ( `column` ) 

添加全文索引:ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 

删除索引

删除非主键索引:ALTER TABLE `table_name` drop INDEX ( `column` ) 

删除主键:ALTER TABLE `table_name` drop PRIMARY KEY

索引的用法

主键、唯一、普通索引的使用,是直接where索引列=’值’

全文索引的使用 where MATCH(列名) AGAINST(‘搜索值1,搜索值2,搜索值3’); 

注:
1.全文索引的字段类型必须为:char,varchar,text 。
2.对于中文全文索引,必须先把字段值做好中文分词,每个关键词之间用“ ,”“ ”分开,不然即使全文索引还是无效,谁让这些都是老外开发的呢(英文单词之间都是空格,妥妥的)
3.有人说将中文转成拼音,然后进行搜索,或许是一个好的方法,可以试一下。

4、停止词:全文索引不针对非常频繁的词做索引,如this,is ,you 即搜索不到

 

以上是关于mysql的索引的主要内容,如果未能解决你的问题,请参考以下文章

mysql索引类型和索引方式

mysql 索引

mysql索引(九)索引合并

mysql覆盖索引和联合索引的区别

mysql---索引优化

MySQL索引