用大表的Mysql性能

时间:2011-06-09 20:36:26

标签: mysql performance full-text-search

我有一张简历表 - 姓名,简历文字,邮政编码,名字,姓氏,经度,纬度,邮编... 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

这个表上的查询起初非常慢,但之后的查询速度更快,我认为它正在缓存它......

如何加快这些查询?感谢

2 个答案:

答案 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)

  1. 在用于连接表的所有字段上使用索引。
  2. 在where子句中使用的字段上使用索引。
  3. 请勿使用“select *”选择仅显示您需要的字段
  4. 分组在分组字段上对结果集进行排序,如果您在其他字段(或不同的顺序)上按顺序排序,则强制进行额外排序会降低速度。
  5. MySQL做快捷方式评估的条件是在where子句中首先限制最大行数。

  6. 使用group by选择*是一种不同的写入“消除重复行”的方法,如果您布置表格,那么没有重复的行开始,您也不需要该组。这将大大加快您的查询速度。

  7. 将您的纬度和经度字段指定为类型点,并在其上添加空间索引。我给你一个链接,但我现在在iphone上,所以现在有点麻烦。