天道不一定酬所有勤
但是,天道只酬勤
Hollis出品的全套Java面试宝典不来了解一下吗?

MySql的InnoDB引擎的索引知识小结

Hollis出品的全套Java面试宝典不来了解一下吗?

InnoDB存储引擎支持两种常见的索引:B+树索引、Hash索引。

B+树索引是目前关系型数据库系统中最常见、最有效的索引。

B+树中的B代表的不是二叉(binary),而是平衡(balance),所以,B+树是平衡树并不是二叉树。

B+树索引能找到的只是被查找数据行所在的页。然后数据库把页读入内存,再从内存中进行查找,最后得到要查找的数据。

在数据库中,B+树的高度一般在2-3层,也就意味着在查找某一个键所对应的值的时候,大概需要2-3次IO。

数据库中的B+树索引分为聚集索引和非聚集索引(辅助索引)

聚集索引就是按照每张表的主键构造一个B+树,B+树的一个叶子几点中记录着表中一行记录的所有值。只要找到这个叶子节点也就得到了这条记录的所有值。

辅助索引的叶节点中不包含行记录的所有值。只包含一个键值和一个书签(bookmark),书签用于定位与索引对应的数据行。

每张表只能有一个聚集索引,可以有多个辅助索引。

辅助索引通过叶级别的指针获得指向主键的索引,然后再通过聚集索引定位数据行。

对于索引的添加或删除操作,MySql数据库会先创建一张临时表,然后把数据导入临时表中,删除原表,再把临时表名改为原来的表名。所以,增加和删除索引有成本。

当某个字段的取值分布范围比较广的时候(高选择性)适合使用B+树索引。如果某字段只有Y和N两个取值,那么没必要使用索引。

如果要查询的字段具有高选择性,但是本次检索的数据占总数据量的一半以上时,MySql就不会使用索引进行查询。

联合索引是指对表上的多个列做索引。

如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col3)和(col1,col2,col3)上建立了索引;这就是最左前缀原则。

搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列。

使用短索引。如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应 该这样做。例如,如果有一个 CHAR(200)列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。

不要过度索引。

Hash只用于使用=或<=>操作符的等式比较。

B+树索引,当使用>、<、>=、<=、BETWEEN、!=或者<>,或者 LIKE 'pattern'(其
中'pattern'不以通配符开始)操作符时,都可以使用相关列上的索引。

赞(0)
如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuang's Blog » MySql的InnoDB引擎的索引知识小结
Hollis出品的全套Java面试宝典不来了解一下吗?

评论 5

  1. #1

    我只是来随便看看!

    华夏九州套图8年前 (2016-11-03)回复
  2. #2

    很不错的样子⊙0⊙

    广告任务网7年前 (2016-11-07)回复
  3. #3

    这句感觉有问题:如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col3)和(col1,col2,col3)上建立了索引;这就是最左前缀原则。

    洋东流5年前 (2019-08-31)回复
    • 经过测试,这句话的描述是正确的,确实都会用到索引。

      wxy4年前 (2019-11-19)回复
    • 不对,好像没用到。。

      wxy4年前 (2019-11-19)回复

HollisChuang's Blog

联系我关于我