SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.08.2014 14:42:36

k0x
Участник
Зарегистрирован: 05.08.2014
Сообщений: 3

Оптимизация SQL-выражения

Здравствуйте! Имею таблицу mysql которая содержит в себе порядка 200,000 записей. Проблема существует в следующем sql-запросе:

$db_result = mysql_query("SELECT id,url,code FROM ".DB_PREFIX."urls WHERE `url` LIKE '%$last'");

Все хорошо когда запрос отрабатывается разово, но если php выполняет его в цикле, скажем при поиске 300-400 разных $last то процесс поиска может затянуться на несколько минут, при этом до окончания процесса поиска - подвисает сайт.
Задача моего sql-выражения - найти в столбце url все записи, которые оканчиваются на $last.
Столбец url, содержит в каждой записи по одной url-ссылке.
Я использую индексы:

Имя индекса, Тип, Уникальный, Упакован,    Столбец, Уникальных элементов, Сравнение, Null
PRIMARY    BTREE    Да    Нет    id    191162    A    Нет
code    BTREE    Да    Нет    code    191162    A    Нет
alias    BTREE    Нет    Нет    owner    340    A    Нет
date_added    BTREE    Нет    Нет    date_added    10620    A    Нет
url    BTREE    Нет    Нет    url    191162    A    Нет


Мой my.cnf

[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 16K
key_buffer_size = 20M
query_cache_size = 10M
innodb_buffer_pool_size = 10M
max_allowed_packet = 4M
table_cache = 40
thread_cache_size = 6
tmp_table_size = 35M
max_heap_table_size = 10M
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 1M
net_buffer_length = 2K
thread_stack = 128K

long_query_time=3
log-slow-queries=/var/log/mysql_long_quarys
log-queries-not-using-indexes

Подскажите, как оптимизировать запрос к БД, что бы избежать "тормозов"?

Неактивен

 

#2 05.08.2014 23:42:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Оптимизация SQL-выражения

Индексы не помогут, так как они помогают искать только по начальному куску. Для иллюстрации: возьмите телефонный справочник и найдите в нем всех, у кого фамилия оканчивается на "мян". Придется перебрать всех.

Может помочь только одно - справочник, отсортированный по фамилии, начиная с последней буквы. Как решение можно создать дополнительно к url поле lru, в котором хранить обращенный посимвольно url. В нем уже искать в начале посимвольно обращенный $last. Тогда индекс над lru поможет.

Неактивен

 

#3 05.08.2014 23:43:06

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Оптимизация SQL-выражения

Мм, а полнотекстовый на такой like не поможет?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 05.08.2014 23:52:18

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Оптимизация SQL-выражения

Полнотекстовый, насколько я знаю, не работает для LIKE, а работает только для MATCH AGAINST

Неактивен

 

#5 06.08.2014 00:01:01

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Оптимизация SQL-выражения

Ну да, я про что-то такое

SELECT id,url,code FROM ".DB_PREFIX."urls WHERE MATCH(`url`) AGAINST ('" . $last . "'* IN BOOLEAN MODE)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 06.08.2014 00:02:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Оптимизация SQL-выражения

Это будет скорее тест на наличие слова $last, а не на наличие куска $last (которое может не быть словом) строго в конце текста.

Неактивен

 

#7 06.08.2014 01:43:03

k0x
Участник
Зарегистрирован: 05.08.2014
Сообщений: 3

Re: Оптимизация SQL-выражения

Всем спасибо! Последовал совету и создал дополнительное поле lru и добавил на него индекс. Так же в запросе вместо LIKE теперь использую "=".

Был бы признателен если бы Вы объяснили в чем разница между LIKE и "=".

Отредактированно k0x (06.08.2014 01:44:38)

Неактивен

 

#8 06.08.2014 02:09:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Оптимизация SQL-выражения

"=" равенство, в случае строк речь идет о посимвольном совпадении, т.е. 'asd' не равно 'a%'.

LIKE - сравнение по образцу. Можно использовать групповые символы. 'asd' like 'a%' даст совпадение.

http://dev.mysql.com/doc/refman/5.5/en/ … rator_like

P.S. замена LIKE на "=" - плохая идея.

Неактивен

 

#9 06.08.2014 03:59:01

k0x
Участник
Зарегистрирован: 05.08.2014
Сообщений: 3

Re: Оптимизация SQL-выражения

vasya написал:

P.S. замена LIKE на "=" - плохая идея.

Обоснуйте пожалуйста

Неактивен

 

#10 06.08.2014 09:24:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Оптимизация SQL-выражения

См предыдущее сообщение. Если у вас задача - найти совпадение по части строки, то "=" не решит задачу.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson