【问题标题】:optimize mysql indexes优化mysql索引
【发布时间】:2011-11-18 01:38:13
【问题描述】:

我有一个缓慢(1.4 秒)的查询,已经困扰了我一段时间,所以我只是想把它放上来看看是否有人可以帮助我优化我的索引以加快它:

select sql_calc_found_rows t.id, q.im_id, concat(t.si_id, ' ', t.de), q.date, q.das, q.dac, u.name, q.ac, q.st
from t300q q
left join t300 t on t.id = q.con_id
left join users u on u.id = q.user_id
order by q.date desc limit 0,100

sql解释结果:

SIMPLE q ALL     89126 Using filesort
SIMPLE t eq_ref PRIMARY PRIMARY 4 db.q.con_id 1
SIMPLE u eq_ref PRIMARY PRIMARY 4 db.q.user_id 1

会话统计:

Handler_read_first = 0
Handler_read_key = 177934
Handler_read_next = 23
Handler_read_prev = 679
Handler_read_rnd = 15
Handler_read_rnd_next = 89127

我有以下索引:

t.id - primary key

q.con_id    |
q.date      | - all form a single index
q.user_id   |

u.id - primary key

从处理程序统计中可以看出,表 q 的大小为 89126 行。

这不是一个大问题,但如果可能的话,我希望将此查询的速度降低到 1 秒以下。

【问题讨论】:

  • q.date 应该有索引吗? mysqlperformanceblog.com/2006/09/01/…
  • 完全没有回答您的问题,但是您可以选择在 PostgreSQL 下尝试相同的查询吗?我通常可以得到 10 表连接,每个连接有 10 几百万行,每行只需要几百毫秒。在需要时自行组合索引非常棒。
  • 不幸的是我没有 postgresql

标签: mysql optimization indexing


【解决方案1】:

查询很慢,因为您没有日期索引。不能使用复合索引,因为日期在中间。要么将日期移动到现有索引中的第一个字段,要么创建一个独立索引。

【讨论】:

  • 我尝试将日期移动到索引中的第一个位置,但查询仍然需要 1.4 秒,然后我尝试自己为 q.date 添加一个新索引(并将另一个索引保留为 q.date)。 date, q.con_id, q.user_id) 但查询仍然需要大约 1.4 秒。谢谢你的想法
  • 查询需要多长时间与故障排除无关。重要的是执行计划是否有任何变化。在哪里?
  • 好点。使用这三个关键定义中的任何一个,explain select 输出都没有变化。但是我只是在另一个使用更高版本的 mysql 的开发数据库上尝试了完全相同的操作,并且查询在 0.4 秒内执行,所以它一定是......
【解决方案2】:

顺便说一句,mysql 仅对 3 列索引的前两列使用相等性。最后一列可以使用范围查询。

即:

WHERE x=? AND y=? order by z;

将使用 (x,y,z) 列的索引(因为 z 可以有范围)。

尝试将“日期”移至第三列并重写查询。

如果这不起作用,则 mysql 不够聪明,无法处理连接中的 con_id 和 user_id。也许您可以重写它,以便这些连接条件发生在 where 子句中。

【讨论】:

  • 好的,我尝试仅恢复由以下字段组成的单个索引,按此顺序:q.con_id、q.user_id、q.date,但速度保持在 1.4 秒左右:P 不确定重新- 编写查询 - 我将把它作为最后的手段,因为这听起来像是糟糕的 sql 练习。无论如何感谢您的提示
【解决方案3】:

尝试在您的数据库上触发 OPTIMIZE 或 ANALYZE,但请确保您在只有很少请求的时间触发它,或者如果服务器上没有正在执行的请求则更好,以避免任何问题出现您可能会在此链接上看到有关此声明的更多信息:

http://dev.mysql.com/doc/refman/5.6/en/analyze-table.html http://dev.mysql.com/doc/refman/4.1/en/optimize-table.html

【讨论】:

    猜你喜欢
    • 2011-09-03
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多