Медленная выборка по ID (MySQL)

K
На сайте с 01.08.2009
Offline
88
633

Есть таблица на 2,5 млн записей, на диске занимает 200 Мб.

Скрипт выбирает с таблицы 20 строк по ID. Требуется на это 3 секунды. Ума не приложу, в чем причина.

MyISAM. Поле ID, конечно же с индексом. key_buffer 850 Mb

Debian, SSD, 1GB RAM.

explain

id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra

1 SIMPLE compkey3_phase3 index NULL PRIMARY 4 NULL 2452373 Using where; Using index

профилирование

starting	0.000010

Waiting for query cache lock 0.000003
checking query cache for query 0.000055
checking permissions 0.000003
Opening tables 0.000008
System lock 0.000005
init 0.000016
optimizing 0.000009
statistics 0.000006
preparing 0.000010
executing 0.000001
Sending data 3.538098
end 0.000015
query end 0.000002
closing tables 0.000005
freeing items 0.000235
logging slow query 0.000003
cleaning up 0.000003
siv1987
На сайте с 02.04.2009
Offline
427
#1

Покажите запрос.

C
На сайте с 26.10.2013
Offline
54
#2

Кроме вас в этот момент с таблицей кто-то работает на изменение? Блокировка ни какая не устанавливается?

Услуги по парсингу данных (/ru/forum/939826), единоразовый и регулярный сбор данных. Любые объемы. Скрипты на PHP, создание и доработка, решение проблем с сайтами Пишите в личные сообщения или скайп
K
На сайте с 01.08.2009
Offline
88
#3

По ходу проблема была в инструменте.

Тестировал скорость запросом, который, как мне казалось, тождественен запросу из скрипта. Этот занимает 3,5 сек.

SELECT *
FROM `compkey3_phase3`
WHERE `id`
IN (
ROUND( RAND( ) *2596943 ) , ... 20 раз ... , ROUND( RAND( ) *2596943 )
)

Но теперь вижу что если написать вручную набор случайных ID, то запрос выполняется быстро (0,015 сек)

SELECT *
FROM `compkey3_phase3`
WHERE `id`
IN ( 344, 5454545, 5455, 8798, 453, 65467, 65767, 867878, 45345, 7567, 878, 5624, 12333, 234222, 4545, 656, 6456, 4543587, 87687, 4324, 543545, 76767, 8787, 9898, 67860, 78678, 469, 757564, 67767 )
bay_ebook
На сайте с 28.05.2010
Offline
111
#4
kalim:
По ходу проблема была в инструменте.

ну для начала это ужас замените на ORDER BY RAND() LIMIT 20

Хотя RAND все ровно будет не очень быстр. Тут наверно лучше думать реализацию через BETWEEN

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
Ragnarok
На сайте с 25.06.2010
Offline
239
#5

kalim, посмотрите в сторону "генерировать 20 рандомных ID в скрипте и делать запрос с IN ()", rand() в запросе будет тормозить

//TODO: перестать откладывать на потом
K
На сайте с 01.08.2009
Offline
88
#6

Прошу прощения, я вас и себя только запутал этим RAND().

Мне не нужны рандомные ID. Все они получены в предыдущем запросе по другой таблицу, обработаны PHP и оставлены 20 самых "подходящих" для этого запроса о котором я спрашивал. А RAND() тут ввел исключительно чтобы можно было тестировать запрос (ведь если я забью 111, 222, 333 запрос закешируется - я имею ввиду подтянутся в память блоки с ключами). В коде у меня "SELECT * FROM tab WHERE id IN (111, 32, 545 ...)" формируется.

Запрос в "естественной среде" работает нормально - 20 записей 0,02 сек.

Joker-jar
На сайте с 26.08.2010
Offline
171
#7
Но теперь вижу что если написать вручную набор случайных ID, то запрос выполняется быстро (0,015 сек)

Запрос мог закешироваться.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий