1

当我向列中添加索引会减慢执行时间时,这怎么可能?试图摆脱慢查询日志中的查询。我的慢查询设置:

slow_query_log = 1
long_query_time = 1 # seconds
log_queries_not_using_indexes = 1
slow_query_log_file = /var/log/mysql-slow.log

描述表 索引减慢查询

4

2 回答 2

4

索引并不总能加快执行速度。索引的效果主要取决于查询的“选择性”:整个查询处理了多少行。

一般来说,读取数据库(“全表扫描”)是一种高效的操作。数据库引擎知道它需要读取哪些页面,并且可以提前读取以获取它们。这样的 I/O 经常发生在后台,而处理页面是在前台。但是,当需要下一页时,很有可能它已经在页面缓存中。

全表扫描的性能问题是表很大。因此,即使是有效的读取也需要时间。当您正在寻找百万分之一的行(“大海捞针”查询)时,读取是浪费时间。这是索引解决问题的地方。

但是,假设您每页有 100 条记录,并且您正在阅读超过 1% 的记录。平均而言,每一页都需要被读取——无论您使用的是索引还是全表扫描。问题是索引读取的效率低于扫描读取。预读机制对他们没有帮助,因为读取是随机的。

这个问题可以通过称为抖动的东西进一步加剧。如果表不适合内存,那么每次随机读取都可能是“缓存未命中”,从而产生从磁盘读取的开销。全表扫描只会读取数据,并且使用一个不错的前瞻系统,不会有缓存未命中。

在您的示例中,您可以通过在索引中包含banner和来增加索引的选择性event(这些是使用相等比较的)和其他字段之一。

于 2013-05-31T13:10:40.497 回答
0

根据磁盘上数据的结构,仅加载整个数据库/列并在 ram 中对其进行排序/过滤(这可能会在不存在索引时发生)比遍历磁盘上的稀疏索引可能更快。我不知道这是否适用于您的特定情况,或者您是否有其他问题。

于 2013-05-31T12:37:15.967 回答