Я работаю над сайтом, на котором база данных огромна. В то время в таблице 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.
Существует множество факторов, которые также могут повлиять на производительность вашего запроса:
и многое другое ….
Следуйте приведенным ниже ссылкам, чтобы получить план выполнения и определить факторы, снижающие производительность: http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/
Как оптимизировать запросы MySQL на основе плана EXPLAIN
Дайте мне знать, если вы столкнетесь с какими-либо проблемами.
Контрольный список:
Альтернативным способом является попытка запроса с использованием активного индекса:
select * from `ratings` where id>=456789 limit 500;
Проверьте индексирование. В каждой таблице должен быть первичный ключ, и в предложении where
вашего запроса могут быть атрибуты, которые не являются частью основного индекса или кластерного индекса.
Вот ссылка Tuts-Plus, которая поможет вам решить вашу проблему.
Наиболее вероятным решением является индексирование базы данных и вместо (*) использование имен столбцов. Лучший способ запроса.
Если вы используете движок InnoDB для своей таблицы, измените его на MyISAM . Это быстрее для операций чтения. Когда использовать MyISAM и InnoDB .
Кроме того, если у вас есть запросы с критериями поиска, убедитесь, что часто используемые столбцы индексируются.