2015-04-28 4 views
3

У меня есть проблема относительно федеративной таблицы двигателя:Slow SELECT ... LIMIT без ИНЕК на федеративной таблице

Я создал федеративную таблицу, указывающую на разумную большую удаленную таблицу (около 800,000 строк, размер строки 211 байт, MyISAM).

При отправке следующего запроса:

SELECT * FROM TABLE LIMIT 0,30 

запрос занимает всегда 9 секунд.

Попытка:

SELECT * FROM TABLE WHERE primaryKey = 1234 

быстро, как обычно (< 0.001s).

Я попытался использовать федеративный стол на нескольких серверах db, всегда тот же результат. Теперь мой вопрос: что-то случилось за занавеской, которую я не знаю? Получает ли Mysql весь индекс без предложения WHERE? Требуется ли некоторая внутренняя сортировка?

В любом случае, на мой взгляд, удаленный сервер db, обслуживающий данные, должен обрабатывать это без задержки, не так ли?

Mysql version: 5.5.31

+0

Для первого запроса MySQL извлекает все 800 000 строк, тогда он принимает 30 из них, начиная с 0-го смещения внутреннего указателя результата и отбрасывая остальные. Поскольку это MyISAM, это связано с большим количеством дисковых операций ввода-вывода. Один из способов «помочь» MySQL сделать это быстрее - это реализовать небольшой чит. Вы можете помочь ему, выполнив что-то вроде 'SELECT * FROM table WHERE id <1000 LIMIT 0, 30'. Теперь, как вы уже видите, я назвал это читом, потому что вам нужно как-то помочь MySQL сократить набор данных, которые он ищет, - ПК всегда является идеальным кандидатом на это. –

ответ

1

FEDERATED имеет много проблем. Он по существу просит другую машину отправлять по одной строке за раз. Это стоит накладные расходы.

Оптимизатор не очень хорош, особенно с FEDERATED, в операции «сжимания» на другой сервер. То есть вместо того, чтобы отдать работу, мог бы сделать другим сервером, он запросит записи, а затем выполнит работу над инициацией сервера.

Остерегайтесь таймингов, подобных (< 0.001s). Обычно это означает, что кеш запросов включен, а запрос не выполнен, а скорее выбран из QC. С FEDERATED, QC не может поддерживаться правильно, поэтому либо он автоматически отключен, либо его следует отключить. (Я не знаю, которые.)

SELECT * FROM TABLE LIMIT 0.30

Это вообще не получает никакого индекса. Он извлекает строки из «данных». Я бы ожидал, чтобы получить 30 строк (в зависимости от того, что 30 первых в .MYD), а затем выйти. Но FEDERATED может быть глупее.

В случае MyISAM, PRIMARY KEY такой же, как любой другой UNIQUE ключ.

Один из способов получить больше понимания, что происходит:

FLUSH STATUS; 
SELECT * FROM TABLE LIMIT 0,30; 
SHOW SESSION STATUS LIKE 'Handler%'; 

Я бы ожидать, чтобы увидеть один или два Обработчикам около 30. Но, от ваших «9 секунд», это может говорить о 800000. Если «800000», то окажется, что FEDERATED не может эффективно сделать что-то просто, как ваш LIMIT.

 Смежные вопросы

  • Нет связанных вопросов^_^