了解过MYSQL数据库的人,都知道索引能提高查询效率。那么为什么索引能提高查询效率?小编将自己的一些看法分享给大家。
1.什么是索引?
索引的本质是一种数据结构。(B+树)我们都知道索引是建立在数据表的某一列上,具有索引列上的值的数据都会存储在数据结构中。
2.索引的重要性。
索引就好比一本书的目录,通过目录就可以快速的找到自己所需要的某一页。设想一下要是没有目录,那么我们就要一页一页进行查找,如果我们所需要的是这本书的最后一页,那么就太费时了。我们都知道MYSQL数据库中的数据都是存放在磁盘中,增添了索引就能大大的减少对磁盘的访问,提高了查询效率。
3.索引的底层到底是什么?
在MYSQL中不同的存储殷勤索引底层的实现是不一样的。
MYISAM存储殷勤底层的数据结构为为B+树,该树的结构下图如图所示,
例如:我们要查询Select stuName form student where stuId = 1。先查看MYI文件(B+树的数据结构在MYI文件)查看stuID 是否有索引如果有就会查找索引树 通过data找到地址对应MYD(数据库中数据表的数据在MYD文件中)的文件位置将结果值返回给我们。MYISAM存储殷勤的索引也成为非聚集索引。
INNODB存储殷勤的底层数据结构是B+树,结构如下图所示所示,
INNODB的存储殷勤的叶子节点携带了数据,该存储殷勤的索引也称聚集索引。
4.是不是索引越多越好?
1.当数据量比较少时,不适合用索引。例如,当一本书的内容只有2页时,目录就有5页,这是 得不偿失的。
2.索引虽然提高查询的效率,但是在insert,updata,delect降低了更新表的速度。
5.什么情况下不适合建立索引?
1.在查询过程中很少用到的查询列。
2.表记录太少。
3.经常増删改的表。
4.某个数据列包含许多重复的内容。
6.索引在什么情况下失效?
1.全字匹配我最爱
例如:一个学生表的某一个索引由stuName,stuAge,stuPos这三列组成,sql语句为 select * from student where stuName='张三',stuAge='12' and stuPost=12; 如果where条件后面的属性的顺序和建立索引时属性的顺序不同那么索引失效。
2. 最佳左前缀法则
例如:索引是由这stuName,stuAge,stuPos三列组成那么查询语句。查询语句为select stuName,stuAge,stuPos foem student 不会发生索引。如果查询条件为select stuAge,stuPos foem student 会发生索引。
3.在索引列上做(计算,函数,类型装换)操作会导致索引失效。
例如:select * from student where left(name,1) = '张';
4.mysql在使用!= 或者 <> 时索引失效。
5.在使用is null 或者 not is null 也会导致索引失效。
6.在使用kike%abc会导致所以失效,kikeabc%不会导致索引失效。
7.数字字符串不加单引号会导致索引失效。
8.使用or链接词会导致索引失效。
这些就是小编的一些看法。不足之处希望大家能指出来。











网友评论