Существует большая база данных, 1 000 000 000 строк, называемых потоками (эти потоки фактически существуют, я не делаю ничего сложнее только из-за того, что мне это нравится). В потоках есть только несколько вещей, чтобы сделать вещи быстрее: (int id, string hash, int answercount, int dateline (timestamp), int forumid, название строки)
Query:
select * from thread where forumid = 100 and replycount > 1 order by dateline desc limit 10000, 100
Так как это 1G записей, это довольно медленный запрос. Так что я подумал, позвольте разделить этот 1G записей на столько таблиц, сколько у меня есть форумов (категорий)! Это почти идеально. Имея много таблиц, у меня меньше записей для поиска, и это действительно быстрее. Теперь запрос будет выглядеть следующим образом:
select * from thread_{forum_id} where replycount > 1 order by dateline desc limit 10000, 100
Это действительно быстрее с 99% форумов (категория), так как большинство из них имеют только несколько тем (100k-1M). Однако из-за того, что некоторые из них содержат около 10 млн записей, некоторые запросы по-прежнему замедляются (0,1/.2 секунды, для моего приложения!, Я уже использую индексы!).
Я не знаю, как улучшить это с помощью MySQL. Есть ли способ?
Для этого проекта я буду использовать 10 серверов (12 ГБ, жесткий диск 4х7200 об/мин на программном рейде 10, четырехъядерный процессор)
Идея состояла в том, чтобы просто разделить базы данных между серверами, но с описанной выше проблемой это все еще не достаточно.
Если я установлю cassandra на этих 10 серверах (предположим, что я нахожу время, чтобы заставить его работать, как и предполагалось), следует ли предположить, что нужно повысить производительность?
Что мне делать? Продолжайте работать с MySQL с распределенной базой данных на нескольких машинах или создайте кластер cassandra?
Меня попросили указать, что такое индексы, вот они:
mysql> show index in thread;
PRIMARY id
forumid
dateline
replycount
Выберите объяснение:
mysql> explain SELECT * FROM thread WHERE forumid = 655 AND visible = 1 AND open <> 10 ORDER BY dateline ASC LIMIT 268000, 250;
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+
| 1 | SIMPLE | thread | ref | forumid | forumid | 4 | const,const | 221575 | Using where; Using filesort |
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+