2016-10-20 3 views
0

Я хочу оптимизировать этот запрос mysql. В моем случае это медленный ужин, так как для выполнения требуется 5,6 секунды. Я использовал профилировщик, чтобы разобраться с проблемой, но у меня нет большой информации о базе данных. Мой вопрос здесь:Как настроить медленный запрос mysql?

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 

Я только PARIMARY INDEX "id" на meta столе и PRIMARY INDEX "id" на name таблице также полнотекстовой поиск включен по имени таблицы. вот снимок экрана: enter image description here

В прошлом здесь мой профилировщик предупреждение снимок экрана:

enter image description here

+0

ваш запрос выглядит нормально .. дать индекс для полей, где условие –

+0

'FULLTEXT' полезна только для«слов»и' MATCH ... AGAINST ... 'синтаксисом. –

ответ

0

Дайте индекс для поля religion и computedmeaning.

См In MySQL how to set index to the table?

Оператор CREATE INDEX заявление используется для создания индексов в таблицах.

Индексы позволяют приложению базы данных быстро находить данные; без прочтения всей таблицы.

+0

проверить время выполнения сейчас. –

0

Использование индекса, безусловно, уменьшит время выполнения вашего запроса.

Однако вы можете попробовать нижеследующий запрос. Это даст вам лучшую производительность.

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 
0
names: INDEX(name, computedmeaning, id) -- in this order 
meta: INDEX(name_id, religion)  -- in either order 

Это names индекс может потреблять ORDER BY, тем самым сохраняя вид. Это также «покрытие», которое помогает в производительности.

Этот индекс meta должен быть эффективным для JOIN.

Смотрите также Cookbook on indexing

+0

Используйте 'EXPLAIN' перед 'SELECT' для создания« плана объяснений »вашего запроса. Это первый инструмент для настройки производительности запроса. Но я думаю, что индексы, предложенные Риком Джеймсом выше, помогут много. Чтобы помочь вашему пониманию, возможно, запустите план объяснения, затем добавьте индексы, а затем запустите другой план объяснения для сравнения. –

Смежные вопросы