我想优化这个mysql查询。在我的情况下,这是超慢的,因为执行需要5.6秒。我使用分析器来解决问题,但我对数据库没有多少了解。我的问题在这里:
SELECT
n.name,
n.computedmeaning,
m.origin,
m.gender,
m.pronunciation,
m.similar,
m.variants
FROM
names n
INNER JOIN meta m ON m.nameid = n.id
WHERE m.religion = 'hindu'
AND n.computedmeaning IS NOT NULL ORDER BY n.name LIMIT 0 , 30
我PARIMARY INDEX "id"
表上只有meta
,PRIMARY INDEX "id"
表上只有name
,名称表上也启用了全文搜索。这是屏幕截图:
最后这是我的探查器屏幕截图警报:
答案 0 :(得分:0)
为字段religion
和computedmeaning
提供索引。
参考In MySQL how to set index to the table?
CREATE INDEX语句用于在表中创建索引。
索引允许数据库应用程序快速查找数据;没有阅读整个表格。
答案 1 :(得分:0)
使用Index肯定会缩短查询的运行时间。
但是,您可以尝试以下查询。它会给你更好的表现。
SELECT
n.name,
n.computedmeaning,
m.origin,
m.gender,
m.pronunciation,
m.similar,
m.variants
FROM
(SELECT *
FROM names
WHERE computedmeaning IS NOT NULL) n
INNER JOIN (SELECT *
FROM meta
WHERE religion='hindu') m ON m.nameid = n.id
ORDER BY n.name LIMIT 0 , 30
答案 2 :(得分:0)
names: INDEX(name, computedmeaning, id) -- in this order
meta: INDEX(name_id, religion) -- in either order
names
索引可以使用ORDER BY
,从而节省排序。它也是"覆盖",这有助于提高性能。
该meta
索引应该对JOIN
有效。