sql - 缓慢的 MySQL 查询。我应该索引什么?

标签 sql mysql indexing

每次您保存页面编辑时,PHPWiki 都有 5 秒的慢查询。 “mysql-slow.log”中经常捕获的查询是:

INSERT INTO wikiscore 
SELECT w1.topage, COUNT(*) 
FROM wikilinks AS w1, wikilinks AS w2 
WHERE w2.topage=w1.frompage 
GROUP BY w1.topage;

目前的指标如下:

table "wikilinks" has a primary index on "frompage" and "topage" 
table "wikiscore" has a primary index on "pagename" and "score"

如何重新制定 SELECT 查询以更快地返回相同的结果?我怎样才能更改索引以使该查询更快?我的想法是它可能被过度索引了吗?

我只对查询的 SELECT 部分的结果计时,仅需要 1-2 秒。 INSERT 必须占用剩下的时间。

保存我想删除的页面时出现延迟。由于已完成大量修改,我无法选择升级到另一个 wiki 引擎(或 PHPwiki 版本)。

有什么想法吗?

编辑---

查询的 SELECT 部分的“EXPLAIN”结果是:

SIMPLE
w2
index
PRIMARY
204
31871   
Using index; Using temporary; Using filesort

SIMPLE
w1
ref
PRIMARY
PRIMARY
102 
phpwiki.w2.topage   
14
Using index

最佳答案

table "wikilinks" has a primary index on "frompage" and "topage"

WHERE w2.topage=w1.frompage

此条件无法通过上述复合索引进行搜索。

要么更改顺序(在 topage, frompage 上创建一个索引),要么在 topage 上创建一个额外的索引。

P. S. 问题的根源在于系统中每个页面的排名都会随着每次编辑而更新。

这个排名系统对我来说有点奇怪:它计算链接到链接的链接,而不是链接本身。

如果 1000 页链接到 Moscow 并且只有 Moscow 链接到 Beket 池塘,那么池塘将获得 1000 分和 Moscow 根本不会得到任何分数,尽管每个人都知道莫斯科而不是池塘。

我想这不是你的意思。很可能它应该看起来像这样:

INSERT INTO
       wikiscore 
SELECT
       linked.topage, COUNT(*) AS cnt
FROM   wikilinks current, wikilinks linked
WHERE  current.frompage=@current_page
       AND linked.topage = current.topage
GROUP BY
       linked.topage
ON DUPLICATE KEY UPDATE
       score = cnt;

这将对从当前页面引用的所有页面的所有链接求和,这似乎是您想要的。

在这种情况下,您需要在 wikiscore 上的 PRIMARY KEY 中删除 score,但我认为将它放在那里没有意义无论如何。

如果你想加快查询排名,你可以创建这样的索引:

ALTER TABLE wikilinks ADD CONSTRAINT pk_wikilinkes_fromto PRIMARY KEY (frompage, topage);

CREATE INDEX ix_wikilinks_topage ON wikilinks (topage);

ALTER TABLE wikiscore ADD CONSTRAINT pk_wikiscore_pagename PRIMARY KEY (pagename);

CREATE INDEX ix_wikiscore_score ON wikiscore (score);

关于sql - 缓慢的 MySQL 查询。我应该索引什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512909/

相关文章:

bool 值作为索引的 Python 效果 (a[a==0] = 1)

sql - 在 Postgresql 中一次只查询 2 列的索引 3 列的最佳选择

php - 如何将值插入数据库中的特定行

mysql - 在 mvc4 的主键中创建自定义序列号

sql - 从 select 语句更新查询仅在字段为空时更新

C# SqlDataReader = 空?

mysql - 查找三个相关日期列中的最小值

java - SQLSyntaxErrorException : data type exception due to `COALESCE` in HSQLDB

php - 查询结果在html中的布局

sql - CASE 子句上的 ORDER BY 可以更快吗?