【问题标题】:mysql index not optimizing querymysql索引未优化查询
【发布时间】:2012-06-10 05:43:17
【问题描述】:

我有一个 mysql MyISAM 表,我在上面做一个简单的select id from mytable limit 1;。这只会冻结系统。

我试过explain select id from mytable limit 1;。它再次冻结了我的系统。表人口统计数据:50k 条记录,10 mbs 大小,2 个索引(主键自动增量),8 列。

我不知道为什么explain 语句失败了,因为它应该显示查询计划,仅此而已。表的大小和记录的数量都不是很大,那为什么mysql工作这么慢?相反,我在这里错过了什么?

【问题讨论】:

  • 顺便说一句:您的查询应该做什么?如果没有ORDER BY 子句,结果将是不确定的...
  • @eggyal 让它成为order by id desc。但是这个查询也冻结了。我有另一个表,里面只有 100 条记录,它可以工作。
  • 当一个连接运行这样一个冻结的查询时,另一个连接在SHOW PROCESSLIST 下对该连接显示什么?
  • 嗯...带有limit 1 它应该“立即”返回,索引与否... else 可能已损坏。 (事件一个 50k 的结果集没有视图操作应该立即开始流式传输——而不是“冻结系统”。)
  • +1 eggyal,你给我指出了正确的方向。谢谢。

标签: mysql sql-execution-plan


【解决方案1】:

这是由于 mytable 上的等待状态。 eggyal 给了我使用 show processlist 的线索。它显示:

+-----+---------+-----------------+----------------+---------+------+---------------------------------+----------------------------------------------------+
| Id  | User    | Host            | db             | Command | Time | State                           | Info                                               |
+-----+---------+-----------------+----------------+---------+------+---------------------------------+----------------------------------------------------+
| 349 | root    | localhost:56612 | mydb           | Query   | 3582 | Waiting for table metadata lock | ALTER TABLE `mytable` ADD INDEX(`fk_to_02`) |

我设置了kill 349 来终止等待链,现在解释语句按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多