Есть ли способ оптимизировать этот запрос MySQL? - PullRequest
3 голосов
/ 19 января 2011
SELECT T1.name AS hotel, 
       T2.name AS city 
  FROM (SELECT * 
          FROM hotel 
         WHERE name LIKE '$term1%') T1,
       (SELECT * 
          FROM city 
         WHERE name LIKE '$term2%') T2
 WHERE T1.city_id = T2.id

T1 имеет 150000, T2 имеет 15000. (статические таблицы!) У меня есть индексы для «name» для этих таблиц.

есть ли способ оптимизировать этот запрос mysql?я также хочу сделать -> НРАВИТСЯ '% term1%', но это очень и очень медленно.

Ответы [ 4 ]

7 голосов
/ 19 января 2011

Первый шаг - переписать запрос, используя ANSI-92 Синтаксис JOIN :

SELECT h.name AS hotel,
       c.name AS city
  FROM HOTEL h
  JOIN CITY c ON c.id = h.city_id
 WHERE h.name LIKE '$term1%'
   AND c.name LIKE '$term2%'

После этого посмотрите на индексирование:

  • HOTEL.name
  • HOTEL.city_id
  • CITY.name
  • CITY.id

... в различных сочетаниях.

1 голос
/ 19 января 2011

Да, просто присоединитесь непосредственно между отелем и городом и переместите два оператора LIKE в предложение WHERE.

Если вы можете изменить структуру таблицы и если есть много дубликатов имен, вы можете нормализовать имяк ключу и найдите в таблице меньшего размера ключ, соответствующий имени, а затем найдите данные на основе ключа имени.

Также добавьте индексы, основанные на ответе "OMG Ponies".

0 голосов
/ 19 января 2011

я тоже хочу сделать -> НРАВИТСЯ '% term1%', но он очень очень медленный

Возможно name LIKE '$term%' OR reverse_name LIKE '$reverse_term%' быстрее, чем name LIKE '%$term%'.Разумеется, с соответствующими показателями.

Я никогда не пытался ... просто заглянул мне в голову.

0 голосов
/ 19 января 2011

Один из способов повысить производительность - поместить полнотекстовый индекс в столбцы имен этих таблиц.

...