当我向列添加索引时,如何减慢执行时间? 试图从慢查询日志中删除查询。 我的慢查询设置:
slow_query_log = 1
long_query_time = 1 # seconds
log_queries_not_using_indexes = 1
slow_query_log_file = /var/log/mysql-slow.log
答案 0 :(得分:4)
索引并不总是加快执行速度。索引的影响主要取决于查询的“选择性”:整个查询处理了多少行。
通常,读取数据库(“全表扫描”)是一种有效的操作。数据库引擎知道它需要读取哪些页面,并且可以提前读取以获取它们。这种I / O经常出现在后台,而处理页面则在前台。但是当需要下一页时,它很可能已经在页面缓存中。
全表扫描的性能问题是表很大。因此即使有效的读取也需要时间当你在寻找一百万行(“大海捞针”查询)时,读取是浪费时间。这是索引解决问题的地方。
但是,假设您每页有100条记录,并且您正在阅读超过1%的记录。平均而言,无论您使用索引还是全表扫描,都需要读取每个页面。问题是索引读取的效率低于扫描读取。预读机制对它们没有帮助,因为读取是随机的。
这个问题可以通过一种叫做颠簸的事情进一步加剧。如果表不适合内存,则每次随机读取可能是“缓存未命中”,从而导致从磁盘读取的开销。全表扫描只会读取数据,并且有一个像样的前瞻系统,就不会有缓存未命中。
在您的示例中,您可以通过在索引中包含banner
和event
(使用相等进行比较)和其他字段之一来提高索引的选择性。
答案 1 :(得分:0)
根据磁盘上数据的结构,加载整个数据库/列并在ram中对其进行排序/过滤可能会更快(这可能在没有索引时发生),而不是遍历磁盘上的sparsed索引。我不知道这是否适用于您的具体情况,或者您是否有其他问题。