【问题标题】:MySql, can anyone suggest how to improve my query / index?MySql,谁能建议如何改进我的查询/索引?
【发布时间】:2011-01-19 08:41:52
【问题描述】:

谁能建议我如何改进我的查询,它用于站点地图并且有 80000 个页面,因此是限制。

这是我的问题

SELECT PageName
FROM pads
WHERE RemoveMeDate = '2001-01-01 00:00:00'
ORDER BY PadID DESC
LIMIT 20000 , 30000

这是我的解释

这是我已经拥有的索引

【问题讨论】:

  • 预期改进的目标应该是什么?
  • 为了缩短 1.9 秒

标签: sql mysql indexing query-optimization


【解决方案1】:

此查询的最佳索引可能是列RemoveMeDatePadIDPageName 上的组合索引。

【讨论】:

  • 我刚刚添加了该索引,但没有任何改进,但它似乎确实使用了它,现在在键列中解释它。请问还有什么建议吗?
  • 从性能角度来看,在 1.9 秒内检索(最多)30000 行并不一定那么糟糕。您确定问题不在于网络或客户端的某个地方吗?
【解决方案2】:

尝试使用任何索引。 表格总共有多少行?

我注意到您正在寻找仅与 RemoveMeDate 匹配的大约 48k 行中的 10k 行 - 表必须很大,否则您必须选择表的大部分。

SELECT PageName
FROM pads USE INDEX()
WHERE RemoveMeDate = '2001-01-01 00:00:00'
ORDER BY PadID DESC
LIMIT 20000 , 30000

不使用任何索引会强制它只扫描表。 现在,如果这没有帮助并且速度较慢,请尝试创建一个订购 DESC 的特定索引,例如尝试以下两种方法之一

CREATE INDEX IX_pads_rmd_iddesc ON pads (RemoveMeDate, PadID DESC, PageName)
CREATE INDEX IX_pads_rmd_iddesc ON pads (RemoveMeDate, PadID DESC)

结合 FORCE INDEX 以防它没有被自动选择

SELECT PageName
FROM pads USE INDEX(IX_pads_rmd_iddesc)
WHERE RemoveMeDate = '2001-01-01 00:00:00'
ORDER BY PadID DESC
LIMIT 20000 , 30000

请注意,即使索引重新创建“PadID DESC”,MySQL 也会忽略它。人们可以希望有一天它会落实到位。

index_col_name 规范可以 以 ASC 或 DESC 结尾。这些关键词 被允许用于未来的扩展 用于指定升序或降序 索引值存储。目前,他们 被解析但被忽略;指数值 总是按升序存储。

【讨论】:

  • 我不知道为什么,但我在测试服务器上得到了更好的结果,这是一台速度慢得多的机器,它在实时服务器上超时。
  • 您认为这可能与音量有关吗? 10k 书签查找(从索引键到数据页以获取 PageName)并非易事
  • 是的,我想是的,我想我需要重新考虑我的站点地图。
【解决方案3】:

如果没有自动选择正确的索引,您应该查看“强制索引”或“使用索引”。

http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

【讨论】:

  • 我已经添加了索引RemoveMeDate, PadID, and PageName(上面Tommi建议)并添加了FROM pads USE INDEX (remmeda_padid_pagename),但没有任何改进
  • 强制索引也无济于事
猜你喜欢
  • 1970-01-01
  • 2015-11-09
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多