ホームページ  >  記事  >  データベース  >  rand()によるmysql順序の効率最適化方法

rand()によるmysql順序の効率最適化方法

jacklove
jackloveオリジナル
2018-06-08 23:36:502093ブラウズ

クエリからデータをランダムに返します。通常は、MySQL の order by rand() メソッドを使用して

例: 200,000 人のユーザーからランダムに 1 人のユーザーを選択します

mysql> select * from user order by rand() limit 1;
+-------+------------+----------------------------------+----------+--------------+-----------+| id    | phone      | password                         | salt     | country_code | ip        |
+-------+------------+----------------------------------+----------+--------------+-----------+| 15160 | 6549721306 | e4f302120c006880a247b652ad0e42f2 | 40343586 | 86           | 127.0.0.1 |
+-------+------------+----------------------------------+----------+--------------+-----------+1 row in set (0.25 sec)mysql> explain select * from user order by rand() limit 1;
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra                           |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+|  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 200303 | Using temporary; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+--------+---------------------------------+1 row in set (0.00 sec)

分析結果によると、操作には 0.25 秒 が必要で、rand() による順序付けには一時テーブル (一時テーブルを使用) を使用する必要があり、ファイル ソート (ファイルソートを使用) を使用する必要があり、非効率的です。

改善方法

1. 最初にクエリされたレコードの合計数を取得します
2. レコードの総数内で N レコードをランダムにオフセットします (N=0~total-1)
3. レコードを取得するには、N,1 を使用します。
コードは次のとおりです:

2db7ab7aeda548b1a568b7abef045e28

分析:

mysql> select * from user limit 23541,1;
+-------+------------+----------------------------------+----------+--------------+-----------+| id    | phone      | password                         | salt     | country_code | ip        |
+-------+------------+----------------------------------+----------+--------------+-----------+| 23542 | 3740507464 | c8bc1890de179538d8a49cc211859a46 | 93863419 | 86           | 127.0.0.1 |
+-------+------------+----------------------------------+----------+--------------+-----------+1 row in set (0.01 sec)mysql> explain select * from user limit 23541,1;
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+|  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 200303 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+--------+-------+1 row in set (0.00 sec)

この記事では、rand() による mysql 順序の効率最適化方法を紹介します。詳細については、PHP 中国語 Web サイトを参照してください。

関連する推奨事項:

データベースへのphpのPDO接続の解釈

PHPオブジェクト指向、PHP継承関連コードの説明

PHPでマジックメソッド__CLASS__を使用してクラス名を取得するオペレーション


以上がrand()によるmysql順序の効率最適化方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。