我们有一个包含 130 000 条记录的表。某个查询(4 个带有一些内部连接和联合的查询)需要 0.13 秒。性能还可以。几个小时后,我们发现执行同一个查询需要 0.4-0.5 秒。
我们做了一个优化表,瞧:同样的查询再次运行平均用时 0.13 秒。
有很多索引的表会不会失去它的性能,而通过优化可以恢复? (更新、删除、插入的时间很好,所以索引在那里没有太大影响)我们在该表上有很多索引,因为我们认为用于内部连接的列上的索引是必需的为了速度。那是错的吗?
示例“Select * from A inner join B on A.column = b.id”,我们在 A.column 上创建索引。
PS:在测试时,我们禁用了查询缓存
编辑:分析信息的细节不同,显然在优化表后,复制到 tmp 表更快。
糟糕的表现: 复制到 Tmp 表 244 毫秒 发送数据 40 µs 优化 44 µs 统计 141 微秒 准备 37 微秒 创建 Tmp 表 45 µs 执行 8 微秒 复制到 Tmp 表 213,6 ms 发送数据 44 微秒 优化 7 微秒 统计 25 微秒 准备 9 微秒 执行 6 微秒
良好的表现: 复制到 Tmp 表 22.1 毫秒 发送数据 39 微秒 优化 33 微秒 统计 105 微秒 准备 33 微秒 创建 Tmp 表 42 µs 执行 11 微秒 复制到 Tmp 表 23.1 毫秒 发送数据 60 µs 优化 11 µs 统计 15 微秒 准备 15 µs 执行 8 微秒
最佳答案
我们通过强制内存中的所有排序等“解决”了这个问题:
tmpdir =/dev/shm
查询现在总是运行 0.1 秒。它花费了我们一些 RAM,但我们有足够的内存来换取速度。
关于MySQL:为什么在优化表后复制到 tmp 表会更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048751/