MySQL 5.6ではなく、テーブルアソシエーションのパフォーマンステストの比較

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...

比較の結果は、索引付けの場合、表の関連付けを選択する方が良いことです。
Mysql>バージョンを選択();
+ —- +
|バージョン()|
+ —- +
| 5.6.37-log |

+ —- +

#############製造開始データ#############

Mysql>バージョンを選択();
+ —- +
|バージョン()|
+ —- +
| 5.6.37-log |
+ —- +

CREATE TABLE a(c1 INT、c2 VARCHAR(2000));

DELIMITER $
pre_test()を作成する
始まる
DECLARE i INT DEFAULT 0;
i <40000がVALUE(i、LPAD(i、1200、0))に挿入されている間;
SET i = i + 1;
終了します。
END $

CALL pre_test();

#多執行的次
SELECT * FROM aに挿入します。
COMMIT;

テーブルを作成します。
SHOW CREATE TABLEを表示します。
INSERT INTO b SELECT * LIMIT 20000から選択します。
COMMIT;
aからCOUNT(1)を選択します。
+ —- +
| COUNT(1)|
+ —- +
| 160000 |
+ —- +
FROM bからCOUNT(1)を選択します。
+ —- +
| COUNT(1)|
+ —- +
| 20000 |
+ —- +

#第一グループ测试
SELECT * FROM b where c1 NOT IN(SELECT c1 FROM a); ## 3.092
説明SELECT * FROM b WHERE c1 NOT IN(SELECT c1 FROM a);
+ – + —– + — + – + —— + – + —- + – + — + —– +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + —– + — + – + —— + – + —- + – + — + —– +
| 1 | PRIMARY | b | ALL | NULL | NULL | NULL | NULL | 18348 | USING WHERE |
| 2 | SUBQUERY | a | ALL | NULL | NULL | NULL | NULL | 146674 | NULL |
+ – + —– + — + – + —— + – + —- + – + — + —– +
SELECT b。* FROM b LEFT JOIN a ON a.c1 = b.c1 WHERE b.c1 IS NULL;#0.018
説明SELECT b。* FROM b LEFT JOIN a ON a.c1 = b.c1 WHERE b.c1 IS NULL;
+ – + —– + — + – + —— + – + —- + – + — + ————– —– +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + —– + — + – + —— + – + —- + – + — + ————– —– +
| 1 |単純| b |すべて| NULL | NULL | NULL | NULL | 18348 | USING WHERE |
| 1 |単純| |すべて| NULL | NULL | NULL | NULL | 146674 | USING WHERE; USING JOINバッファ(ネストされたLOOPのブロック)|

+ – + —– + — + – + —— + – + —- + – + — + ————– —– +

#第二グループ测试
SELECT *どこからc1 NOT IN(SELECT c1 FROM b); ## 0.081
SELECT *をどこからc1 NOT IN(SELECT c1 FROM b)から出しますか?
+ – + —– + — + – + —— + – + —- + – + — + —– +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + —– + — + – + —— + – + —- + – + — + —– +
| 1 | PRIMARY | a | ALL | NULL | NULL | NULL | NULL | 146674 | USING WHERE |
| 2 | SUBQUERY | b | ALL | NULL | NULL | NULL | NULL | 18348 | NULL |
+ – + —– + — + – + —— + – + —- + – + — + —– +
SELECT a。左ジョインからb bc1 = a.c1どこb.c1がNULLであるか; #Outは来ることはできません
SELECTを説明してください。* LEFT JOINからbを引きます。b.c1 = a.c1 b.c1がNULLです。
+ – + —– + — + – + —— + – + —- + – + — + ————– —– +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + —– + — + – + —— + – + —- + – + — + ————– —– +
| 1 |単純| a |すべて| NULL | NULL | NULL | NULL | 146674 | NULL |
| 1 |単純| b |すべて| NULL | NULL | NULL | NULL | 18348 | USING WHERE; USING JOINバッファ(ブロックネストループ)|
+ – + —– + — + – + —— + – + —- + – + — + ————– —– +

#加索引后
CREATE INDEX ind_a_c1オンa(c1);
CREATE INDEX ind_b_c1オンb(c1);
#第三그룹测试
SELECT * FROM b where c1 NOT IN(SELECT c1 FROM a); ## 0.053
説明SELECT * FROM b WHERE c1 NOT IN(SELECT c1 FROM a);
Mysql> SELECTを説明する* FROM bからどこにc1 NOT(SELECT c1 FROM a);
+ – + ——- + — + ——- + —— + —– + —- + – + — + —— ——- +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + ——- + — + ——- + —— + —– + —- + – + — + —— ——- +
| 1 | PRIMARY | b | ALL | NULL | NULL | NULL | NULL | 18348 | USING WHERE |
| 2 | DEPENDENT SUBQUERY | a | index_subquery | ind_a_c1 | ind_a_c1 | 5 | func | 2 | USING INDEX;フルスキャンON NULLキー|
+ – + ——- + — + ——- + —— + —– + —- + – + — + —— ——- +

SELECT b。* FROM b LEFT JOIN a ON a.c1 = b.c1 b.c1がNULLの場合;#0.001
説明SELECT b。* FROM b LEFT JOIN a ON a.c1 = b.c1 WHERE b.c1 IS NULL;
+ – + —– + — + – + —— + —– + —- + —– + – + ——— +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + —– + — + – + —— + —– + —- + —– + – + ——— +
| 1 | SIMPLE | b |リファレンス| ind_b_c1 | ind_b_c1 | 5 | const | 1 | USING INDEX CONDITION |
| 1 | SIMPLE | a | ref | ind_a_c1 | ind_a_c1 | 5 | test.b.c1 | 1 | USING INDEX |
+ – + —– + — + – + —— + —– + —- + —– + – + ——— +

#四组测试
SELECT COUNT(1)どこからc1 NOT IN(SELECT c1 FROM b); ## 0.022
説明SELECT COUNT(1)どこからc1 NOT IN(SELECT c1 FROM b);
+ – + —– + — + — + —— + —- + —- + – + — + ——— +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + —– + — + — + —— + —- + —- + – + — + ——— +
| 1 | PRIMARY | a | INDEX | NULL | ind_a_c1 | 5 | NULL | 146674 | USING WHERE; USING INDEX |
| 2 | SUBQUERY | b | INDEX | ind_b_c1 | ind_b_c1 | 5 | NULL | 18348 | USING INDEX |
+ – + —– + — + — + —— + —- + —- + – + — + ——— +

SELECT COUNT(1)LEFT JOIN Bからb.c1 = a.c1 b.c1がNULLの場合;#0.052
左の結合からSELECT COUNT(1)を説明します。b.c1 = a.c1 b.c1がNULLです。
+ – + —– + — + — + —— + —- + —- + —– + — + ——– – +
| id | select_type | TABLE | TYPE | possible_keys | KEY | key_len | ref | ROWS |
+ – + —– + — + — + —— + —- + —- + —– + — + ——– – +
| 1 | SIMPLE | a | INDEX | NULL | ind_a_c1 | 5 | NULL | 146674 | USING INDEX |
| 1 | SIMPLE | b | ref | ind_b_c1 | ind_b_c1 | 5 | test.a.c1 | 1 | USING WHERE; USING INDEX |
+ – + —– + — + — + —— + —- + —- + —– + — + ——– – +


1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...
      この投稿は審査処理中  | 元のサイトへ