Je suis en train de travailler sur un projet (Rails 3.0.15, ruby 1.9.3-p125-perf) où la db est en localhost et de la table des utilisateurs a un peu plus de 100 enregistrements.
À l'aide de
order by RAND()
est assez lent
De l'utilisateur.la commande("le RAND(id)").première
devient
SÉLECTIONNEZ users
.* D' users
ORDER BY RAND(id) LIMITE de 1
et prend de 8 à 12 secondes pour répondre!!
Rails de journal:
Charge de l'utilisateur (11030.8 ms) SÉLECTIONNEZ users
.* D' users
ORDER BY RAND()
LIMITE de 1
à partir de mysql expliquer
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+
| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 110165 | Using temporary; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+
Vous pouvez voir qu'aucun indice est utilisé (possible_keys = NULL), une table temporaire est créée et un supplément de passe est nécessaire pour récupérer la valeur souhaitée (extra = Aide temporaire; à l'Aide de filesort).
D'autre part, en divisant la requête en deux parties, et à l'aide de Ruby, nous avons raisonnable amélioration des temps de réponse.
users = User.scoped.select(:id);nil
User.find( users.first( Random.rand( users.length )).last )
(;néant pour la console)
Rails de journal:
Charge de l'utilisateur (25.2 ms) SELECT id from users
de la Charge Utilisateur (de 0,2 ms) SÉLECTIONNEZ
users
.* D' users
OÙ users
.id
= 106854 LIMITE de 1
et mysql expliquer prouve pourquoi:
+----+-------------+-------+-------+---------------+--------------------------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+--------------------------+---------+------+--------+-------------+
| 1 | SIMPLE | users | index | NULL | index_users_on_user_type | 2 | NULL | 110165 | Using index |
+----+-------------+-------+-------+---------------+--------------------------+---------+------+--------+-------------+
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
nous pouvons maintenant utiliser uniquement les index et les clés primaires et de faire le travail à environ 500 fois plus rapide!