mongodb索引优化(索引优化)

lxf2023-08-08 11:10:02

在某些情况下,MySQL可以直接使用索引来满足ORDER BY或GROUP BY子句,而无需额外的排序。尽管ORDER BY与索引的顺序不完全匹配,但只要WHERE子句中包含未使用的索引部分和所有额外的ORDER BY字段,就仍然可以使用索引。

使用索引的MySQL排序

以下查询都使用索引来求解ORDER BY或GROUP BY部分:

SELECT * FROM t1 ORDER BY key_part1,key_part2,...;SELECT * FROM t1其中key _ part1 =常数ORDER BY key _ part2SELECT * FROM t1其中key _ part1 =常量GROUP BY key _ part2SELECT * FROM t1 ORDER BY key _ part 1 desc,key _ part 2 desc;SELECT * FROM t1其中key _ part 1 = 1 ORDER BY key _ part 1 desc,key _ part 2 desc;

MySQL Order By不带索引

在其他情况下,MySQL不能使用索引来满足ORDER BY,尽管它会使用索引来查找匹配WHERE子句的记录。这些情况如下:

*对不同的索引键进行排序:

SELECT * FROM t1 ORDER BY key1,key2

*对不连续的关键部分进行排序:

SELECT * FROM t1其中key2 =常数ORDER BY key _ part2

ASC和DESC都被使用:

SELECT * FROM t1 ORDER BY key _ part 1 desc,key _ part2 ASC

*用于搜索记录的索引键与用于排序的索引键不同:

SELECT * FROM t1其中key2 =常数ORDER BY key1

*有多个表连接在一起,读取记录中ORDER BY中的所有字段都不是来自第一个非常数表(即解释分析结果中第一个表的连接类型不是const)。

*使用了不同的ORDER BY和GROUP BY表达式。

*表索引中的记录不是按顺序存储的。比如哈希表和堆表就是这样。

通过执行解释选择...ORDER BY,可以知道MySQL在查询中是否使用索引。如果额外字段的值使用文件排序,MySQL就不能使用索引。有关详细信息,请参见“7.2.1解释语法(获取有关选择的信息)”。在MySQL 4.1之前,当必须对结果进行排序时,它使用以下文件排序算法:

1.根据索引键读取记录,或扫描数据表。与WHERE子句不匹配的记录将被忽略。

2.在缓冲区中,每个记录使用一对来存储两个值(索引键和记录指针)。缓冲区的大小取决于系统变量sort_buffer_size的值。

3.当缓冲很慢时,运行qsort(快速排序)并将结果存储在一个临时文件中。保存存储的块指针(如果所有‘对’值都可以保存在缓冲区中,就没有必要创建临时文件)。

4.执行上述操作,直到所有记录都被读出。

5.进行多次合并,并将最多有MERGEBUFF(7)个区域的块保存在另一个临时文件中。重复此操作,直到第一个文件中的所有块都放入第二个文件中。

6.重复上述操作,直到剩余块数小于MERGEBUFF2 (15)。

7.在最后一次多重合并中,只有记录的指针(排序索引键的最后一部分)被写入结果文件。

8.通过读取结果文件中的记录指针按顺序读取记录。为了优化这个操作,MySQL将记录指针读入一个大块,并用它来顺序读取记录,并将记录放入缓冲区。缓冲区的大小取决于系统变量read_rnd_buffer_size的值。此步骤的代码在源文件sql/records.cc '中。

这种近似算法的一个问题是数据库读取记录两次:第一次是在估计WHERE子句时,第二次是在排序时。虽然第一次成功读取了记录(例如,进行了全表扫描),但第二次是随机读取(索引键是有序的,但记录不是)。在MySQL 4.1和更高版本中,文件排序优化算法不仅用于包含记录的键值和位置,还用于包含查询中所需的字段。这样做可以避免两次读取记录的需要。改进的文件排序算法大致如下:

1.像以前一样,读取匹配WHERE子句的记录。

2.对于每个记录,记录一个对应的记录;元组信息,包括键值、记录位置和查询中需要的所有字段。

3.根据索引键对“元组”信息进行排序。

4.按顺序读取记录,但只能从排序的“元组”列表中读取,而不是再次从数据表中读取。

使用改进的文件排序算法,“元组”需要比“对”占用更长的空,并且它们很少适合排序缓冲区(缓冲区的大小由sort_buffer_size的值决定)。因此,这可能需要更多的I/O操作,从而导致改进算法的速度变慢。为了避免使其变慢,这种优化方法只在排序‘tuple’中额外字段的大小之和超过系统变量max_length_for_sort_data时使用(将该变量的值设置得过高的表现之一是磁盘负载高,CPU负载低)。如果你想提高排序的速度,首先要看MySQL是否可以使用索引来代替额外的排序过程。如果不能使用索引,可以尝试遵循以下策略:

*增加排序缓冲区大小的值。

*增加read_rnd_buffer_size的值。

*修改tmpdir以指向具有许多备用空的专用文件系统。

如果使用MySQL 4.1或更高版本,该选项允许多个路径采用循环格式。在Unix上,路径由冒号(“:”)和分号(“;”)分隔)在Windows、NetWare和OS/2上。)。您可以使用此功能在几个目录之间平均分配负载。注意:这些路径必须是分布在不同物理磁盘上的目录,而不是同一物理磁盘上的不同目录。

adminjs.cn是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 Adminjs.cn还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 在Adminjs.cn中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!