Forum Webscript.Ru

Общие => Базы данных => Тема начата: Alone от 21 Августа 2006, 17:14:42

Название: Долго висит статус Sending data
Отправлено: Alone от 21 Августа 2006, 17:14:42
Mysql 4.1.20

Есть таблица


CREATE TABLE `click_words_date` (
 `date` date NOT NULL default \'0000-00-00\',
 `id_word` int(10) unsigned NOT NULL default \'0\',
 `searches` mediumint(8) unsigned NOT NULL default \'0\',
 `clicks` mediumint(8) unsigned NOT NULL default \'0\',
  KEY `date` (`date`,`id_word`),
  KEY `date_2` (`date`,`clicks`,`searches`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
 

Кол-во строк в таблице около 9М

Выполняем запрос

SELECT id_word, searches, clicks FROM click_words_date
WHERE date = \'2006-08-20\'
ORDER BY clicks DESC , searches DESC
LIMIT 0,100
 

Все ок выполняеться почти мгновенно
EXPLAIN говорит

select_type: SIMPLE
type: ref
key: date_2
key_len: 3
ref: const
rows: 1278673
Extra: Using where
 

Но!

SELECT id_word, searches, clicks FROM click_words_date
WHERE date = \'2006-08-20\'
ORDER BY clicks DESC , searches DESC
LIMIT 119910, 100

Выполняеться почти 20сек

Чем дальше "листаешь" от первой страницы тем дольше выполняется запрос :(

Это так и должно быть или это из-за причудливых изгибом моих рук? :)

На сервере работает еще innoDB, о самом сервере могу сказать только что это дедик с 3Г памяти :) И не могу сказать что я очень уверен что сервер(mySQL) настроен оптимально :) Если нужно могу выложить избранные моменты из результата работы show variables или show status :)
Название: Долго висит статус Sending data
Отправлено: fidget от 22 Августа 2006, 09:33:01
Ну, учитывая то что MySQL читает больше миллиона записей из 9, то 20 секунд это не так что бы совсем ужасно.
Sending data может долго висеть если у тебя проблемы с сетью, с диском и также этот статус показывается когда на самом деле запрос еще выполняется :)
Попробуй создать индекс на (`date`,`clicks`,`searches`, `id_word`).
Тогда MySQL будет использовать только индексный файл и не будет трогать файл данных.

Попробуй увеличить также sort_buffer_size и read_rnd_buffer_size.
Название: Долго висит статус Sending data
Отправлено: Alone от 22 Августа 2006, 10:40:58
Спасибо, попробую поиграться с памятью :)
Название: Долго висит статус Sending data
Отправлено: Alone от 23 Августа 2006, 17:02:09
Совсем не помогло :(
Название: Долго висит статус Sending data
Отправлено: fidget от 23 Августа 2006, 19:13:28
а что теперь explain показывает?
Название: Долго висит статус Sending data
Отправлено: fidget от 23 Августа 2006, 19:17:12
странно что он использует только часть индекса, что по date.
Название: Долго висит статус Sending data
Отправлено: fidget от 23 Августа 2006, 19:19:13
Попробуй сделать еще такой финт ушами:

SELECT id_word, searches, clicks, date FROM click_words_date
WHERE date = \'2006-08-20\'
ORDER BY date DESC, clicks DESC , searches DESC
LIMIT 119910, 100

и посмотри что тебе EXPLAIN скажет.
Название: Долго висит статус Sending data
Отправлено: Alone от 24 Августа 2006, 11:07:12
Да в общем говорит то же самое :(
изменение индексов, настроек не к чему не привела :(
Блин, загадка природы, исполняет автор...
Название: Долго висит статус Sending data
Отправлено: fidget от 24 Августа 2006, 13:05:21
кстати, а если ты выполняешь запрос несколько раз, то у тебя он все время так медленно выполняется?

У меня просто похожий по структуре запрос на 30-миллионной табличке, где он сканирует пол-миллиона строк выполняется за 2-4 секунды первый раз (пока MySQL грузит индексы в кэш) и порядка 0.15-0.25 секунды последующие разы.

Это на моей домашней машинке, поэтому говорить о каких-то мощностях самого сервера не приходится.

Возможно у вас загружен key_buffer_size.