Mysql Долго выполняется запрос, как ускорить

peon

Lok'tar ogar
Mysql.

Таблица имеет ~1,327,531 записей, 35 полей.

Такой запрос выполняется 2.8470 сек. Как ускорить хотя бы до 1 сек.

Код:
SELECT formalname
FROM  `d_fias_addrobj`
WHERE shortname =  'г'
AND formalname LIKE  'К%'
ORDER BY formalname
LIMIT 0 , 10
 

rukhem

Новичок
покажите

Код:
explain SELECT formalname FROM `d_fias_addrobj`  WHERE shortname = 'г' AND formalname LIKE 'К%' ORDER BY formalname LIMIT 0 , 10
ой formalname LIKE 'К%' - зло отказывайтесь от него
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
peon, делаем так:
1. создаем отдельную колонку с первой буквой от твоего formalname, тип char(1)
2. фигачим составной индекс по двум колонкам, а именно formalname+shortname
3. В запросе пишем WHERE formalname = 'K' AND shortname='г' (порядок важен)
4. Смотрим EXPLAIN запроса и думаем дальше над селективностью индесов
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Фанат, это если у него поле позволит сделать индекс

Ступил, забыл, что по TEXT тоже можно делать индекс, но нужен префикс
 

Фанат

oncle terrible
Команда форума
если там текст, то запрос тогда не будет иметь смысла вообще. А я не думаю, что он настолько дурак
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
peon, судя по твоему EXPLAIN у тебя идет фулл-скан таблицы, не использются индексы. Если хочется быстрого решения, то можешь сделать как посоветовал Фанат. Ну либо мой вариант, но это более геморройно.
 

peon

Lok'tar ogar
Произвел индекс, теперь 0.2061 сек. Спасибо!

создаем отдельную колонку с первой буквой от твоего formalname, тип char(1)
Ради интереса спрошу, это можно сделать с помощью запроса sql, без применения php?
 

peon

Lok'tar ogar
В добавок спрошу. Если дропну ненужные поля, это повлияет на скорость выполнения запроса?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ну вообще да, глупый ты вопрос задал, если честно. Через тот же phpMyAdmin это делается. ALTER TABLE ... и т.д. Наверняка же делал уже не раз это.

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
В добавок спрошу. Если дропну ненужные поля, это повлияет на скорость выполнения запроса?
При использовании индекса - не особо. А вот если при полном сканировании таблицы - скорее да. Если в полях, что ты дропнул было довольно много данных жежательно сделать оптимизацию таблицы.
 

rukhem

Новичок
> индекс на formalnameне делайте так

Уж лучше по первой букве отдельное поле и индекс на него
 

peon

Lok'tar ogar
Ну вообще да, глупый ты вопрос задал, если честно. Через тот же phpMyAdmin это делается. ALTER TABLE ... и т.д. Наверняка же делал уже не раз это.
Новое поле сделал, потом его заполнил первыми буквами от твоего formalname и т.д. как я описал.
Я бы мог сделать это с помощью php, то есть беру первый символ поля formalname вставляю в соответствующее поле first_char. И так весь ~миллион записей, что будет производиться довольно долго.
Я имею ввиду, можно ли было сделать это без необходимости прибегать к помощи php, то есть на чистом sql.
Возможно сработал бы такой вариант: сделать дубликат столбца formalname и поменять тип на char(1), что урежет значения.


Это тоже медленно.
показывай эксплейн теперь
 
Сверху