「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
上次回顾了MySQL的索引结构,接下来看看MySQL的中有哪些索引。
MySQL中的索引
MySQL中为我们提供了诸如主键、唯一索引、普通索引和全文索引等类型,这几种类型的索引都使用B-tree进行存储。空间索引用的R-tree。还有一些基于内存的存储引擎支持hash索引,其中全文索引同时使用了倒排索引结构。
MySQL中的索引策略
如果我们一个查询中有多个索引,MySQL会选择索引行最少的索引,也即是最具选择性的索引。
复合索引的优化
如果我们创建了一个复合索引,包含了多个列,比如包含了a、b两列,那么MySQL会使用a列先进行匹配,a匹配上了之后才会对b列进行匹配。如果where条件中只出现了b列,那么索引是不会生效的,在这种情况下,我们可以有一种比较诡异的技巧可以使用。假设我们的a是个状态列,比如只有0,1两种状态,那么,我们只对b进行筛选的时候,可以有如下语句:
select a,b from table where a in (0, 1) and b = '你的筛选条件';
其中我们有复合索引(a,b),其中以a为左列,那么这个时候我们的复合索引就可以起作用了。我们一直强调要在选择性高的列做索引,但是我们看到a只有两种状态,它的选择性不高,但是这种技巧却可以有效利用复合索引。
索引需要注意的问题
对于where条件中的查询列,要避免对改列使用函数,比如min(),max()等。对索引列进行函数操作会使索引失效,也不应对索引列进行数学操作,如加减等操作,这些同样会使索引失效。