Операция MySQL занимает более минуты, чтобы выполнить

Я работаю над сайтом, на котором база данных огромна. В то время в таблице 1 миллион записей. Когда я выполняю запрос, для выполнения требуется слишком много времени. Один пример запроса приведен ниже:

select * from `ratings` order by id limit 499500, 500 

Каждый запрос занимает более одной минуты, но когда я отбрасываю таблицу до 10 тысяч записей, этот запрос выполняется быстро.

Поскольку я прочитал, что нет проблемы для 1 миллиона записей в таблице, потому что в таблицах базы данных нет проблем с большими записями.

Я использовал индексирование id в таблице с помощью вопроса Stack Overflow. Как добавить индексы в таблицы MySQL? , но все же у меня такая же проблема.

*** Я использую CodeIgniter для проекта.

Обратите внимание, что это не означает, что на минуту использовать MyISAM. Я использую это только для того, чтобы мои идентификаторы, min, max и count были в очереди. Поэтому проигнорируйте двигатель, пожалуйста.

 create table ratings ( id int auto_increment primary key, thing int null )engine=MyISAM; insert ratings (thing) values (null),(null),(null),(null),(null),(null),(null),(null),(null); insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; insert ratings (thing) select thing from ratings; 

У меня теперь есть 4.7M строк

 select count(*),min(id),max(id) from ratings; +----------+---------+---------+ | count(*) | min(id) | max(id) | +----------+---------+---------+ | 4718592 | 1 | 4718592 | +----------+---------+---------+ select * from `ratings` order by id limit 499500, 500; -- 1 second on a dumpy laptop 

,

 explain select * from `ratings` order by id limit 499500, 500; +----+-------------+---------+------+---------------+------+---------+------+---------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+------+---------------+------+---------+------+---------+----------------+ | 1 | SIMPLE | ratings | ALL | NULL | NULL | NULL | NULL | 4718592 | Using filesort | +----+-------------+---------+------+---------------+------+---------+------+---------+----------------+ 

,

 explain select * from `ratings` where id>=499501 limit 500; +----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+ | 1 | SIMPLE | ratings | range | PRIMARY | PRIMARY | 4 | NULL | 4198581 | Using index condition | +----+-------------+---------+-------+---------------+---------+---------+------+---------+-----------------------+ 

Мораль истории может заключаться в использовании предложения where.

Нельзя исключать возможность тупика.

Начните с проверки плана выполнения запроса для определения узкого места и создания индексов, если это необходимо. Я думаю, вы должны иметь индекс в столбце Id.

Существует множество факторов, которые также могут повлиять на производительность вашего запроса:

  1. Фрагментация страниц данных
  2. Статистика таблицы не обновлена
  3. Многие запросы выполняются параллельно

и многое другое ….

Следуйте приведенным ниже ссылкам, чтобы получить план выполнения и определить факторы, снижающие производительность: http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/

Как оптимизировать запросы MySQL на основе плана EXPLAIN

Дайте мне знать, если вы столкнетесь с какими-либо проблемами.

Контрольный список:

  • Созданный кластеризованный индекс (индекс) в столбце «id» по ASC
  • Проверьте время запроса из командной строки, см. Это
  • Проверьте свой код PHP (я вижу, что вы используете CodeIgniter ). О вашем алгоритме: использовали ли вы библиотеку базы данных CodeIgniter?
    Если вы используете необработанный запрос, проверьте свой цикл.

Альтернативным способом является попытка запроса с использованием активного индекса:

 select * from `ratings` where id>=456789 limit 500; 

Проверьте индексирование. В каждой таблице должен быть первичный ключ, и в предложении where вашего запроса могут быть атрибуты, которые не являются частью основного индекса или кластерного индекса.

Вот ссылка Tuts-Plus, которая поможет вам решить вашу проблему.

Наиболее вероятным решением является индексирование базы данных и вместо (*) использование имен столбцов. Лучший способ запроса.

Если вы используете движок InnoDB для своей таблицы, измените его на MyISAM . Это быстрее для операций чтения. Когда использовать MyISAM и InnoDB .

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