|
|
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Есть таблица 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 Подскажите, как оптимизировать запрос к БД, что бы избежать "тормозов"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 14:44:45 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
k0x, ты не используюешь индексы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 14:49:23 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
alex564657498765453k0x, ты не используюешь индексыа он и не может их использовать, ибо like '%$last' если k0x, хотите быстро - делайте ещё одну колонку с "развёрнутым" урлом (ur.lqs.www), индексируйте её и ищите по like '$last_reverted%' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 14:55:14 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
tanglirделайте ещё одну колонку с "развёрнутым" урлом+1 Да и общую логику хорошо бы пересмотреть. 300-400 однотипных запросов - ерунда какая-то. Подозреваю, что происходит попытка на PHP выполнить такую обработку, которую не получилось сделать на SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 15:15:31 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
tanglir, 1) Использование % в sql-выражении подразумевает поиск без использования индексов? 2) $last - содержит в себе информацию после последнего слеша в урл-адресе (например file.zip) правильно Вас понял, вы имеете ввиду создать ещё одну колонку, разместить в ней $last и искать по ней обычным WHERE = '$last'? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 15:16:06 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
miksoft, Не совсем однотипные, этот запрос обрабатывает пачку разных url. Не уверен но возможно будет лучше использовать выражение WHERE IN ('') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 15:18:21 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
k0x, Намного разумней сделать еще одну колонку, да. Числовую, плюс индекс по ней. Использование % - в начале подразумевает, что индекс использоваться не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 15:31:02 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
Users, Простите, не совсем понял почему именно числовую? Ведь данные которые в ней будут хранится - имеют текстовый формат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 15:36:50 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
Создал дополнительный столбец last в нём содержится часть ссылки которая следует за последним слешем "/". Тип столбца varchar(255) utf8_general_ci . Индекс: Имя индекса Тип Уникальный Упакован Столбец Уникальных элементов Сравнение Null last BTREE Нет Нет last 191162 A Нет Модифицировал запрос: $db_result = mysql_query("SELECT id,url,code FROM ".DB_PREFIX."urls WHERE `last` = '$last'"); Тем не менее при обработке 400 ссылок в цикле, операция выполняется так же долго как и в предыдущей версии выражения. Подскажите пожалуйста, где я ошибся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 16:27:49 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
k0xUsers, Простите, не совсем понял почему именно числовую? Ведь данные которые в ней будут хранится - имеют текстовый формат. Да не, не будут. :) зачем им иметь текстовый формат? Зачем нам с вами писать слово last и искать по нему, когда это можно добавить колонку IsLast и ставить 1 только у тех записей, которые как раз last? и выбирать, соответственно: where IsLast = 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 17:21:17 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
k0xСоздал дополнительный столбец last в нём содержится часть ссылки которая следует за последним слешем "/". Тип столбца varchar(255) utf8_general_ci . Индекс: Имя индекса Тип Уникальный Упакован Столбец Уникальных элементов Сравнение Null last BTREE Нет Нет last 191162 A Нет Модифицировал запрос: $db_result = mysql_query("SELECT id,url,code FROM ".DB_PREFIX."urls WHERE `last` = '$last'"); Тем не менее при обработке 400 ссылок в цикле, операция выполняется так же долго как и в предыдущей версии выражения. Подскажите пожалуйста, где я ошибся? далее потом. нельзя так вообще не делать? В запросе написано буквально следующее: отбери мне все данные из таблицы, где такое-то поле имеет такое-то значение. не одну строку, а все строки, где это значение равно last. И зачем это проделывать 400 раз? Вы уже в первом же вызове получили все эти 400 строк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 17:32:01 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
Users, Users Вы уже в первом же вызове получили все эти 400 строк. Как это возможно? Ведь есть же условие WHERE `last` = '$last'" и оно возвратит только одну запись. У меня на PHP цикл foreach, которому "скармливают" на входе массив из урл адресов. Далее Скрипт ищет в таблице совпадения по такому шаблону: http://site.com/12345/ file.zip, то что отмечено красным - мы ищем в таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 18:04:04 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
k0x, Вот я пишу: tbl_test (Islast char(4)) вставляю в нее четыре строки со значением 'abcd' select l.Islast from tbl_test l where l.Islast = 'abcd' сколько записей будет возвращено? Все четыре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 18:11:03 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
k0xУ меня на PHP цикл foreach, которому "скармливают" на входе массив из урл адресовImplode (или эксплоуд, не помню) этот массив в строку с разделителем-запятой, и делать один запрос с IN вместо четырёхсот ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 18:42:00 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
tanglir, Запрос с IN будет целесообразнее чем отдельных 400 коннектов ? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2014, 18:57:26 |
|
||
|
Оптимизация SQL-выражения
|
|||
|---|---|---|---|
|
#18+
k0xtanglir, Запрос с IN будет целесообразнее чем отдельных 400 коннектов ? :)Скажем так, мне сложно придумать ситуацию, при которой он не будет лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2014, 05:23:28 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38713389&tid=1834405]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 354ms |

| 0 / 0 |
