Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
explain select * from articles
inner join (select article_id FROM articles WHERE user_rating > 5 ORDER BY published_at DESC LIMIT 100 )
as lim using (article_id);
*************************** 1. row *********
id: 1
select_type: PRIMARY
table: <derived2>
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 3
Extra:
*************************** 2. row *********
id: 1
select_type: PRIMARY
table: articles
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: lim.article_id
rows: 1
Extra:
*************************** 3. row *********
id: 2
select_type: DERIVED
table: articles
type: index
possible_keys: NULL
key: published_at
key_len: 14
ref: NULL
rows: 5
Extra: Using where; Using index
Простейший запрос вида SELECT * FROM articles WHERE user_rating > 5 ORDER BY published_at DESC LIMIT 100; мусклем выполняется из рук вон плохо: он будет сортировать на жестком диске _все_ статьи.Действительно подобный запрос, который сложнее, чем 99% (а то и 99.9%) запросов, выполняемых web-приложениями в таком виде будет выполняться медленно — особенно если не будет соотвествующих индексов.
так в чем его козыри то?Максимальная скорость на простых запросах. Нужно ли вам это или нет — решать вам. И хотите ли вы перепроектировать систему чтобы получить адекватный результат — тоже.
ммм, зачем dump/restore? В 8.2+ уже есть достаточно неплохой автовакуум, но как говорят, все равно нужно вакуумизировать руками.Какая разница? Все эти способы всё равно требуют останова системы на изрядный промежуток времени и не позволяют делать эффективный откат. Как происходит upgrade у нормальной базы данных? В четыре этапа:
Насчет более эффективной системы — вы хотите сказать, что мускль быстрее постгреса вытащит данные из базы, если у нас одно поле выборки и по нему есть индекс. Так?Да. Меньше накладные расходы. Насколько я знаю — это до сих пор правда, хотя последний раз бенчмарки я видел год или полтора назад. Просто разработчики PostgreSQL сконцентрированы на другом.
Насчет апдейта понял. Разве тут у мускля есть серьезные преимущества перед постгресом?Да. При upgrade вам необходимо обязательно сконвертировать в новый формат одну базу: mysql. В которой хранятся системные настройки. Они практически никогда не бывает больше пары мег (и даже это — редкость). Всё остальное можно переводить постепенно — буквально по одной таблице.
Т.е. если есть хоть какая-то загрузка, лично я попросту ещё не нашел смысла в мускле и был бы рад узнать, чем же он крут.MySQL отлично держит нагрузку на огромном количестве простых запросов. Судя по вашему примеру у вас несколько смещено понятие «простого» запроса. Возможно на вас плохо повлияло обучение релицонным базам данных, возможно вы просто как-то по другому мыслите, но простой запрос — это простой запрос: выборка по одному индексу, сравнение на =, <, >. Вы не поверите, но для огромного числа задач ничего больше и не нужно. Если правильно базу организовать.
mysql> create table articles (article_id int auto_increment primary key, user_rating int, published_at datetime, key(published_at, user_rating)) engine=innodb; Query OK, 0 rows affected (0.06 sec) mysql> insert into articles values(1,1,'2008-01-01'),(2,4,'2008-04-04'),(3,10,'2007-12-12'),(4,20,'2008-11-11'),(5,10,'2008-11-11'); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> explain select * from articles where user_rating > 5 order by published_at desc; +----+-------------+----------+-------+---------------+--------------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+---------------+--------------+---------+------+------+--------------------------+ | 1 | SIMPLE | articles | index | NULL | published_at | 14 | NULL | 5 | Using where; Using index | +----+-------------+----------+-------+---------------+--------------+---------+------+------+--------------------------+ 1 row in set (0.02 sec)
Переезд с PostgreSQL на MySQL