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

jacklove
リリース: 2018-06-08 23:36:50
オリジナル
2152 人が閲覧しました

クエリからデータをランダムに返します。通常は、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 を使用します。
コードは次のとおりです:

<?php// 获取总记录数$sqlstr = &#39;select count(*) as recount from user&#39;;$query = mysql_query($sqlstr) or die(mysql_error());$stat = mysql_fetch_assoc($query);$total = $stat[&#39;recount&#39;];// 随机偏移$offset = mt_rand(0, $total-1);// 偏移后查询$sqlstr = &#39;select * from user limit &#39;.$offset.&#39;,1&#39;;$query = mysql_query($sqlstr) or die(mysql_error());$result = mysql_fetch_assoc($query);
print_r($result);?>
ログイン後にコピー

分析:

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!