powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL-выражения
17 сообщений из 17, страница 1 из 1
Оптимизация SQL-выражения
    #38713105
k0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
k0x
Гость
Здравствуйте! Есть таблица 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

Подскажите, как оптимизировать запрос к БД, что бы избежать "тормозов"?
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713112
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0x,

ты не используюешь индексы
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713124
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453k0x,

ты не используюешь индексыа он и не может их использовать, ибо like '%$last'
если

k0x, хотите быстро - делайте ещё одну колонку с "развёрнутым" урлом (ur.lqs.www), индексируйте её и ищите по like '$last_reverted%'
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713156
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirделайте ещё одну колонку с "развёрнутым" урлом+1

Да и общую логику хорошо бы пересмотреть. 300-400 однотипных запросов - ерунда какая-то. Подозреваю, что происходит попытка на PHP выполнить такую обработку, которую не получилось сделать на SQL.
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713158
k0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
k0x
Гость
tanglir,

1) Использование % в sql-выражении подразумевает поиск без использования индексов?
2) $last - содержит в себе информацию после последнего слеша в урл-адресе (например file.zip) правильно Вас понял, вы имеете ввиду создать ещё одну колонку, разместить в ней $last и искать по ней обычным WHERE = '$last'?
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713161
k0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
k0x
Гость
miksoft,

Не совсем однотипные, этот запрос обрабатывает пачку разных url. Не уверен но возможно будет лучше использовать выражение WHERE IN ('')
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713179
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0x,

Намного разумней сделать еще одну колонку, да. Числовую, плюс индекс по ней.
Использование % - в начале подразумевает, что индекс использоваться не будет.
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713191
k0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
k0x
Гость
Users,

Простите, не совсем понял почему именно числовую? Ведь данные которые в ней будут хранится - имеют текстовый формат.
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713275
k0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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 ссылок в цикле, операция выполняется так же долго как и в предыдущей версии выражения.

Подскажите пожалуйста, где я ошибся?
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713330
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0xUsers,

Простите, не совсем понял почему именно числовую? Ведь данные которые в ней будут хранится - имеют текстовый формат.

Да не, не будут. :) зачем им иметь текстовый формат? Зачем нам с вами писать слово last и искать по нему, когда это можно добавить колонку IsLast и ставить 1 только у тех записей, которые как раз last? и выбирать, соответственно:

where IsLast = 1
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713346
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 строк.
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713384
k0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
k0x
Гость
Users,

Users Вы уже в первом же вызове получили все эти 400 строк.

Как это возможно? Ведь есть же условие WHERE `last` = '$last'" и оно возвратит только одну запись.
У меня на PHP цикл foreach, которому "скармливают" на входе массив из урл адресов. Далее Скрипт ищет в таблице совпадения по такому шаблону:
http://site.com/12345/ file.zip, то что отмечено красным - мы ищем в таблице.
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713389
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0x,

Вот я пишу:

tbl_test (Islast char(4))

вставляю в нее четыре строки со значением 'abcd'

select l.Islast from tbl_test l where l.Islast = 'abcd'

сколько записей будет возвращено? Все четыре.
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713402
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0xУ меня на PHP цикл foreach, которому "скармливают" на входе массив из урл адресовImplode (или эксплоуд, не помню) этот массив в строку с разделителем-запятой, и делать один запрос с IN вместо четырёхсот
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713410
k0x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
k0x
Гость
tanglir,

Запрос с IN будет целесообразнее чем отдельных 400 коннектов ? :)
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713583
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
k0xtanglir,

Запрос с IN будет целесообразнее чем отдельных 400 коннектов ? :)Скажем так, мне сложно придумать ситуацию, при которой он не будет лучше.
...
Рейтинг: 0 / 0
Оптимизация SQL-выражения
    #38713937
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Спорный строковый литерал изменил. Оффтоп и склоки зачистил, прошу не возобновлять.
Если случайно удалил что-то по теме, то прошу извинить, напишите еще раз.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL-выражения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]