索引的概念
索引用于快速找出在某个列中有一特定值的行,不使用索引,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 即搜索不到