数据库优化学习笔记(四)
索引基本介绍
没有索引的情况下,查找数据是遍历表所有数据,因为实际的查询的某个值记录不止一条,得查找到最后一条才能确定唯一。
对要查找的条件列建立索引,会在数据库中存放一个索引文件,存储结构为B树。

上图建立了Iname_pinyin字段的索引,查找数据时从根节点开始一直查找到叶节点,直到查找到对应值的主键地址,再在原表中查找记录。
主键建立的索引叫 丛生索引,该索引在叶子节点存储的是实际的数据,不是地址。
这里知道了索引大概的原理,但实际索引存储的数据结构有很多种,这里不深入研究了。
索引实效的场合总结
这个比较重要,这里介绍四点可能会导致索引失效的情况:
1、进行后方一致/部分一致检索的场合。
例:select * from employee where column_name like '%w%';
select * from employee where column_name like '%w';
2.使用了is not null、!=、<>比较运算的场合
在数据库优化学习笔记(一)中说过,不要使用不等号,要一一列举出来。
3、对列使用了运算/函数的场合
例:select * from table_name where YEAR(birth) = '1980';
4、复合索引的第一列没有包含在where条件语句中的场合
例如创建了这个索引:create index idx_pinyin on employee(lname_pinyin,fname_pinyin);针对上面这个索引,下面两种情况索引是有效的:
√select * from employee where lname_pinyin = 'wang';
√select * from employee where lname_pinyin = 'wang' and fname_pinyin ='xiao';
以下两种情况是会失效的:
×select * from employee where fname_pinyin ='xiao';
×select * from employee where lname_pinyin = 'wang' or fname_pinyin ='xiao';
第二条用了or关键字,所以还要单独对fname_pinyin列进行检索,因此也会失效。