Il y a une grosse base de données, plus 1 000 000 000 de lignes, appelé fils (ces fils existent réellement, je ne fais pas les choses plus difficiles juste parce que j'aime ça). Fils n'a que quelques trucs, faire les choses plus vite: (int id, string hachage, int replycount, int ligne de changement de date (timestamp), int forumid, string titre)
Requête:
select * from thread where forumid = 100 and replycount > 1 order by dateline desc limit 10000, 100
Depuis qu'il y a 1G de dossiers, il est tout à fait une requête lente. Alors j'ai pensé, nous allons diviser cette 1G de dossiers en autant de tableaux que de nombreux forums(catégorie) j'ai! C'est presque parfait. Ayant beaucoup de tables, j'ai moins de record à les chercher partout et il est vraiment plus rapide. La requête devient:
select * from thread_{forum_id} where replycount > 1 order by dateline desc limit 10000, 100
C'est vraiment plus rapide avec 99% des forums (catégorie) étant donné que la plupart de ceux qui ont seulement quelques-uns des sujets (100k-1M). Cependant, parce qu'il y a quelques avec environ 10M de données, dont certaines requêtes sont encore à ralentir (0.1/.2 secondes, pour beaucoup pour mon application!, Je suis déjà en utilisant des indices!).
Je ne sais pas comment faire pour améliorer cela à l'aide de MySQL. Est-il possible?
Pour ce projet je vais utiliser 10 Serveurs (12 go de ram, 4x7200rpm disque dur sur le raid logiciel 10, quad core)
L'idée était simplement de diviser les bases de données entre les serveurs, mais le problème est expliqué ci-dessus qui n'est toujours pas assez.
Si j'installe cassandra sur ces 10 serveurs (en supposant que je trouve le temps de faire qu'il fonctionne comme il est censé) devrais-je suppose que pour avoir un gain de performance?
Que dois-je faire? Continuer à travailler avec MySQL avec base de données distribuée sur plusieurs machines ou de construire un cluster cassandra?
On m'a demandé de poster ce sont les indices, ils sont ici:
mysql> show index in thread;
PRIMARY id
forumid
dateline
replycount
Sélectionnez expliquer:
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 |
+----+-------------+--------+------+---------------+---------+---------+-------------+--------+-----------------------------+