索引是什么
索引在表的列上创建。索引是一种数据结构,索引包含一个表中列的值,并且这些值存储在一个数据结构中。
工作原理
使用索引的全部意义就是通过缩小一张表中需要查询的记录/行的数目来加快搜索的速度。
为什么要用索引
索引的一个主要目的就是加快检索表中数据的方法,能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。索引存储了指向表中某一行的指针。
如果没有索引:select * from table1 where idCard="123456789",必须遍历整个表,直到idCard等于123456789的这一行被找到为止;有了索引之后,即可在索引中查找。由于索引是经过算法优化过的,因而查找次数要少的多。简而言之,索引是用来定位的。
怎么用(使用原则)
索引使用原则:表中的某一列或者某几列在查询过程中使用得非常频繁,那就应按需在该列上创建索引。
索引分类
1.聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。
2.非聚集索引:
普通分类:
(1) 唯一索引
作用:避免同一个表中某数据列中的值重复
与主键索引的区别:主键索引只能有一个,唯一索引可有多个
(2) 普通索引
作用:快速定位特定数据
注意:index 和 key 关键字都可以设置常规索引,但不要加太多普通索引,会影响数据的变更效率
(3) 全文索引
作用:快速定位特定数据
按索引列个数分类:
(1) 单行索引:单数据列
(2) 复合索引:多数据列组成的复合索引。复合索引使用原则:最左原则,有A、B、C三个字段建立的联合索引,如果A字段在查询时为空,那么这个复合索引不生效;如果A字段不为空,B、C不管为不为空,那么复合索引都是生效的。
是不是建了索引,在查询时都会使用到
并不是,很多sql都不会使用到建立的索引。比如:
1. 模糊查询以%开头,如 like
" %Nanci
"
2. 索引列进行表达式计算或者函数式操作
3. 索引列用了 != ,or, in(多个值)
备注:in里面如果只有一个值,例如:age in(12) 是等同于age=12的,会使用到索引。
4. 在where子句中进行null值判断:age is null( is not null)
5.复合索引不满足最左原则
数据库索引使用代价
数据库索引并不是越多越好,心里要有一把称,适可而止,恰到好处。
1.索引会占用空间:表越大,索引占的空间越大。
2.数据库性能:主要是在表中新增、修改和删除数据时,索引也会有相同的操作。建立在某列或多列的索引需要保存该列最新的数据。
关于hash和btree两种索引方法对比
Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash 索引的查询效率要远高于 B-Tree索引。
但是我们日常使用的都是:btree。
使用:btree而不使用hash。最重要的一点,我觉得是:Hash索引在任何时候都不能避免表扫描。
推荐hash和btree对比的一篇文章:https://blog.csdn.net/liushuxiaderiluo/article/details/97235285
内容纯属个人观点。
爬山了这座山,才能看到山下的风景。