Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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 :)
-
Ну, учитывая то что MySQL читает больше миллиона записей из 9, то 20 секунд это не так что бы совсем ужасно.
Sending data может долго висеть если у тебя проблемы с сетью, с диском и также этот статус показывается когда на самом деле запрос еще выполняется :)
Попробуй создать индекс на (`date`,`clicks`,`searches`, `id_word`).
Тогда MySQL будет использовать только индексный файл и не будет трогать файл данных.
Попробуй увеличить также sort_buffer_size и read_rnd_buffer_size.
-
Спасибо, попробую поиграться с памятью :)
-
Совсем не помогло :(
-
а что теперь explain показывает?
-
странно что он использует только часть индекса, что по date.
-
Попробуй сделать еще такой финт ушами:
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 скажет.
-
Да в общем говорит то же самое :(
изменение индексов, настроек не к чему не привела :(
Блин, загадка природы, исполняет автор...
-
кстати, а если ты выполняешь запрос несколько раз, то у тебя он все время так медленно выполняется?
У меня просто похожий по структуре запрос на 30-миллионной табличке, где он сканирует пол-миллиона строк выполняется за 2-4 секунды первый раз (пока MySQL грузит индексы в кэш) и порядка 0.15-0.25 секунды последующие разы.
Это на моей домашней машинке, поэтому говорить о каких-то мощностях самого сервера не приходится.
Возможно у вас загружен key_buffer_size.