数据库索引学习笔记

2019-09-29  本文已影响0人  asmer

数据库索引学习笔记

数据库索引优化是后台开发必备的技能,本文记录下学习数据库索引的一些心得。

MyISAM和InnoDB的区别

MyISAM适合读多写少的场景,不支持事务。使用的全局锁,写性能差。
InnoDB适合表更新和写入频繁的场景。支持事务。使用行锁,性能比MyISAM要好

索引的类型

通常我们提到索引,一般指的就是B-Tree索引,但其实除了B-Tree索引,还存在其它的数据库索引,下面列举几种:

使用索引时要注意哪些问题

主键上的索引与其它列索引的区别

MySQL中,通常主键上的索引就是聚簇索引聚簇索引的特点是索引值和表数据在同一个索引树中,因此通过聚簇索引的查询效率很高,找到索引意味着就找到了数据。
其它列的索引也叫二级索引二级索引的特点是通过索引值找到的数据行只是一个行的主键值,需要通过这个主键值到聚簇索引上才能找到完整的行数据。下图是通过二级索引找到行数据的过程。

微信截图_20190929174907.png

多字段联合索引的实现?

联合索引包含了多个字段的值,根据多个字段值进行排序。联合索引的查找遵循最左前缀匹配的原则,因为索引列的顺序是首先按照最左列进行排序,其次是第二列,等等。下图是联合索引的一个例子:
创建一个表People,并建立一个联合索引(last_name, first_name, dob)

联合索引实现1.png

联合索引优先使用第一个列last_name排序,然后是第二个列first_name,最后是dob

联合索引的实现.png

什么情况下需要建联合索引

如果一个查询涉及到了多个字段,那么通常会基于这多个字段建立联合索引。通常有这么几种场景。

如何决定联合索引的列顺序?

一个经验法则是:通常把选择性最高的列放在前面(可以优先筛选掉更多的行)

什么是选择性高的列?distinct(列)/行数 这个占比越高,选择性就越高。举个反例,性别是个选择性很低的列,因为distinct(性别)就只有两个值,男和女。指定条件"男"去搜索能选出一半的行。

哪些情况不适合建索引?

数据库怎么决定要不要使用索引?

按照我们的常识,如果列上有索引,那么数据库肯定就会用,不存在要不要用的问题。其实不然,数据库会根据查询的效率去判断要不要用索引。如果直接做全表轮询的效率比用索引的效率高,那么数据库就会选择做全表轮询。

举个例子,比如有张员工表,有Name和Age属性,总行数有1万行,其中Age大于20的有9000行。此时要查询Age大于10的所有员工姓名,如果用索引的话,就需要查询索引表9000次,再通过索引表中的指针去找到行取出Name字段。这个效率明显还不如直接轮询整张表。

提高索引性能的一些技巧

上一篇下一篇

猜你喜欢

热点阅读