MySQL:为什么在优化表后复制到 tmp 表会更快

标签 mysql sql-server performance optimization indexing

我们有一个包含 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/

相关文章:

mysql - 使用 where 子句查找与另一个 col 的最小值关联的值

mysql - 为什么这个存储过程返回一个空结果?

mysql - 使用 MVC 处理tinyInt boolean 值

sql-server - SQL Server 中许多操作超时并阻塞进程

sql-server - SQL Server Management Studio 声明变量

CPU 使用率 100% 时的 Java 线程优化

c# - 使用 IL Emit 替换 Activator.CreateInstance

php - php 中的表单

c# - 在相似数据库之间移动数据

Java for 循环 - 代码效率