Mysql производительность с большим столом - PullRequest
2 голосов
/ 10 июня 2011

у меня есть таблица резюме - имена, текст резюме, почтовый индекс, имя, фамилия, долгота, широта, почтовый индекс ... 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 ]

1 голос
/ 10 июня 2011
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. В лучшем случае он будет захватывать все местоположения, которые соответствуют широте или долготе, и исследовать потенциальные ряды вдоль другого измерения. Вам нужно только исследовать строки, которые помещаются в меньшую рамку.

Для этого вам нужен пространственный индекс .

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 - полнотекстовый индекс , чтобы быть конкретным.

0 голосов
/ 10 июня 2011
  1. Использовать индексы для всех полей, используемых для объединения таблиц.
  2. Используйте индексы для полей, которые вы используете в предложении where.
  3. Не используйте 'select *', выберите только те поля, которые вам нужны .
  4. Группировка по сортировке вашего результирующего набора по сгруппированным полям, если вы упорядочиваете по другому полю (или другому порядку) , вы выполняете дополнительную сортировку, замедляя процесс.
  5. MySQL выполняет ускоренную оценку, помещая условие, ограничивающее максимальное количество строк, первым в предложении where.

  6. Выбрать * с помощью группы по - это другой способ написать «исключить повторяющиеся строки», если вы разметили свои таблицы, чтобы не было повторяющихся строк, для начала вам не нужносгруппировать по.Это значительно ускорит ваши запросы.

  7. Укажите ваше поле широты и долготы в качестве типовой точки и поместите в них пространственный индекс.Я бы дал вам ссылку, но сейчас я нахожусь на iphone, так что это немного хлопотно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...