高性能的索引策略(一)

时间:2022-03-14 20:44:47

在设计数据库的时候我们通常会设计索引来提高对select 语句的执行效率。


索引简介

在MYSQL中索引是在存储引擎层实现的而不是服务器层,索引在MYSQL中也称为Key,是存储引擎用于快速查找到记录的一种数据结构。其实对索引最直接的理解可以通过一个简单的例子,那就是去看看一本书的“索引”部分,想在一本书中找到特定主题,一般最直接的方法就是查看本书的索引找到对应的页码。

MYSQL 的索引可以包含一个或多个列的值时,MYSQL只能高效的利用索引最左边前缀列。比如创建一个包含两个列的索引和创建连个只包含一列的索引是大不相同的。索引有以下几个优点:

①  索引大大减少了服务器需要扫描的数据量;

②  索引可以帮助服务器避免排序和临时表;

③  索引可以将随机I/O变成顺序I/O。


高性能的索引策略

正确的创建和使用索引是实现高性能查询的基础。

1、 独立的列

独立的列指的是索引列不能是表达的一部分,也不能是函数的参数。下面我们来看看两个常见的错误,

错误一:SELECT actor_id FROM actor WHERE actor_id + 1 = 5;  很容易看出来WHERE后的表达式等价于 actor_id = 4 ,但是MYSQL不会自动的去识别解析我们应该养成简化WHERE 条件的习惯,始终将索引列单独放在比价符(“ = ”)的一侧;

错误二:SELECT ...  WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;


2、 前缀索引和索引选择性

前缀索引是一种能用索引更小、更快的有效办法,但是其缺点是MYSQL无法使用前缀索引作ORDER BY 和GROUP BY,也无法使用前缀索引做覆盖扫描。如果创建前缀索引这是一个很有技巧的活,其实也不难,但是我不想在这给大家介绍了,因为我觉得我们一般设计的数据库都不是那种很庞大的,而都是一些中小型的,想了解的同学可以自己去查看相关资料。

索引的选择性是指 不重复的索引值(也称为基数 cardinality)和数据表的记录总数(#T)的比值,范围从1/#T到1之间。索引的选择性越高则查询效率就越高,因为选择性高的索引可以让MySQL在查找时过滤掉更多的行,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。


3、  多值索引

多值索引在理解的时候就会出先很多错误,常见的有为每个列创建独立的索引,或者按照错误的顺序创建多列索引;还有就是专家提的“把WHERE 条件里的列都创建索索引”。

4、 选择适合的索引列顺序

正确的索引列顺序依赖于使用该索引的查询,并且同时需要考虑如何更好地满足排序和分组的需要。选择索引列顺序的最简单方法就是“将选择性最高的列放在索引的最前列”,当不需要考虑排序和分组的时候,将选择性最高的列放在前面通常是很好的 。但这只是适用于多数情况下,要注意的是不要假设平均情况下的性能也能代表特殊情况下的性能,特殊情况可能会摧毁这个应用的性能,这需要具体情况具体去分析。