我想优化这个mysql查询。在我的例子中,它是超级慢的,因为它需要5.6秒来执行。我使用profiler来解决这个问题,但我对数据库没有太多的了解。我的问题是:
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我只有meta表上的PARIMARY INDEX "id"和name表上的PRIMARY INDEX "id",还在name表上启用全文搜索。以下是屏幕截图:

最后是我的分析器屏幕截图警报:

发布于 2016-10-20 16:01:00
为字段religion和computedmeaning指定索引。
参考In MySQL how to set index to the table?
CREATE INDEX语句用于在表中创建索引。
索引允许数据库应用程序快速查找数据,而无需读取整个表。
发布于 2016-10-20 17:58:20
使用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发布于 2016-10-23 09:14:21
names: INDEX(name, computedmeaning, id) -- in this order
meta: INDEX(name_id, religion) -- in either order该names索引可能会消耗ORDER BY,从而节省排序。它也是“覆盖”,这有助于提高性能。
该meta索引对于JOIN应该是有效的。
另请参阅
https://stackoverflow.com/questions/40147101
复制相似问题