powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как победить fileSort ?
8 сообщений из 8, страница 1 из 1
Как победить fileSort ?
    #33484513
MegaTron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ей богу толи руки кривые, толи лыжи не едут,

берем простейшую таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE usersStats (
  uid int( 10 ) unsigned NOT NULL default '0',
  messNew tinyint( 3 ) unsigned NOT NULL default '0',
  logTime int( 10 ) unsigned NOT NULL default '4294967295',
  regTime int( 10 ) unsigned NOT NULL default '4294967295',
  PRIMARY KEY  (uid),
  KEY logTime (logTime),
  KEY regTime (regTime)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

В logTime и regTime хранится 4294967295 - time(). Было сделано в надежде убить DESC в Order By.

Делаем простейший запрос
Код: plaintext
EXPLAIN SELECT * FROM `usersStats` ORDER BY logTime 

использует filesort
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE usersStats ALL NULL NULL NULL NULL 2350 Using filesort

медленно офигеваем и делаем запрос по первичному ключу
Код: plaintext
EXPLAIN SELECT * FROM `usersStats` ORDER BY uid 

и видим
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE usersStats ALL NULL NULL NULL NULL 2350 Using filesort

Данные в таблице 23 500 записей, uid уникальный auto_inc,
logTime время регистрации за 3 месяца ... mySql 3.23
...
Рейтинг: 0 / 0
Как победить fileSort ?
    #33484868
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Увеличь кеш ключей.
параметр key_buffer
...
Рейтинг: 0 / 0
Как победить fileSort ?
    #33485273
MegaTron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин КУвеличь кеш ключей.
параметр key_buffer

Установил параметры
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
key_buffer            = 1024K
max_allowed_packet    = 1M
table_cache           =  4 
sort_buffer_size      = 16000K
read_buffer_size      = 256K
read_rnd_buffer_size  = 256K
net_buffer_length     = 2K
thread_stack          = 64K
skip-locking

тот же запрос
Код: plaintext
EXPLAIN SELECT * FROM `usersStats` ORDER BY logTime 

все тот же косяк
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE usersStats ALL NULL NULL NULL NULL 2350 Using filesort


вот еще данный может в них косяк
Код: plaintext
1.
Имя ключа Тип Количество элементов Действие Поле 
logTime  INDEX   2350        logTime  

Код: plaintext
1.
2.
3.
4.
Используемое пространство:   
Тип Использование 
Данные  32 , 900  Bytes 
Индекс  21 , 504  Bytes 
Всего  54 , 404  Bytes 
...
Рейтинг: 0 / 0
Как победить fileSort ?
    #33485286
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OPTIMIZE TABLE `usersStats`;?
...
Рейтинг: 0 / 0
Как победить fileSort ?
    #33485309
MegaTron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал
CHECK TABLE `usersStats`
ANALYZE TABLE `usersStats`
REPAIR TABLE `usersStats`
OPTIMIZE TABLE `usersStats`
FLUSH TABLE `usersStats`

запрос
Код: plaintext
EXPLAIN SELECT * FROM `usersStats` ORDER BY logTime 

отклик
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE usersStats ALL NULL NULL NULL NULL 2350 Using filesort

млин, я скоро ноги протяну с этим filesort ом:)

PS: локальная копия MySQL 4.1.8-max, что будет творится на mysql 3.23 хостинга вообще страшно представить...
...
Рейтинг: 0 / 0
Как победить fileSort ?
    #33485808
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MegaTron
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE usersStats ALL NULL NULL NULL NULL 2350 Using filesort


Ага, сразу не заметил, для сортировки 2350 записей вполне возможно, что MySQL не будет использовать индекс :) сильно трудоемко, легче отсортировать в буфере в памяти, что скорее всего и происходит.

Когда сильно мало записей - тогда сервер быстрее отсортирует напрямую, тем более, что запрос типа select * берет все данные таблицы...

а что очень долго этот запрос работает? дольше 0,02с ???
...
Рейтинг: 0 / 0
Как победить fileSort ?
    #33485817
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, я все понимаю, но зачем Вам все 23 500 записей сразу? :)
тихо подозреваю - если добавите ограничение на выборку по этому полю, то сразу все получится! ;)

--
Dmitry
...
Рейтинг: 0 / 0
Как победить fileSort ?
    #33485859
MegaTron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dinkyне, я все понимаю, но зачем Вам все 23 500 записей сразу? :)
тихо подозреваю - если добавите ограничение на выборку по этому полю, то сразу все получится! ;) Dmitry

Спасибо!!!

Действительно запрос вида:
Код: plaintext
EXPLAIN SELECT * FROM `usersStats` ORDER BY logTime LIMIT  0  ,  10  

делает все как надо:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE usersStats index NULL logTime 4 NULL 21150

У меня же все руки не доходили до последнего замечания, в доке про то что если будет выбиратся более 30% записей то mysql забудет про индексы...
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как победить fileSort ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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