我有一张简历表 - 姓名,简历文字,邮政编码,名字,姓氏,经度,纬度,邮编... 500,000+行
我查询它的方式:
按位置,例如:
1) SELECT * FROM resumes
WHERE ((latitude BETWEEN 44.3523845787 AND 45.6809474213)
AND (longitude BETWEEN -110.873064254 AND -108.993603746))
GROUP BY lastname,longitude
LIMIT 0, 50
by name
2) SELECT * from resumes
(MATCH(resume) AGAINST ('donald')) AS relevance
FROM resumes
WHERE (MATCH(resume) AGAINST ('donald'))
GROUP BY lastname,longitude
ORDER BY relevance DESC
LIMIT 0, 50
这个表上的查询起初非常慢,但之后的查询速度更快,我认为它正在缓存它......
如何加快这些查询?感谢
答案 0 :(得分:1)
1) SELECT * FROM resumes
WHERE ((latitude BETWEEN 44.3523845787 AND 45.6809474213)
AND (longitude BETWEEN -110.873064254 AND -108.993603746))
GROUP BY lastname,longitude
LIMIT 0, 50
by name
这个可以很少使用btree索引。最好的情况是,它会抓住所有适合纬度或经度的位置,并调查沿其他维度的潜在行。你想要的只是调查适合较小盒子的行。
为此,您需要spacial index。
2) SELECT * from resumes
(MATCH(resume) AGAINST ('donald')) AS relevance
FROM resumes
WHERE (MATCH(resume) AGAINST ('donald'))
GROUP BY lastname,longitude
ORDER BY relevance DESC
LIMIT 0, 50
同样,这也需要一种特殊的索引,而不是btree - full text index是特定的。
答案 1 :(得分:0)
MySQL做快捷方式评估的条件是在where子句中首先限制最大行数。
使用group by选择*是一种不同的写入“消除重复行”的方法,如果您布置表格,那么没有重复的行开始,您也不需要该组。这将大大加快您的查询速度。