MySQL はストアド プロシージャをどのように使用して数千万のデータを挿入し、効率を向上させているのでしょうか?

--MySQL テスト タスク: ストアド プロシージャを使用し、数千万のデータをテーブルに挿入し、インデックスに従って速度を最適化します。
-- 1. インデックス クエリを使用する
-- 2. インデックス検索を使用しない
-- 3. 2 つのクエリ速度の違いを比較します。

-- 1. インデックステストテーブルを作成する
存在する場合はテーブルを削除します。
CREATE TABLE インデックス_テスト(
id BIGINT(20) 主キーが NULL ではありません AUTO_INCREMENT、
USER VARCHAR(16) デフォルト NULL、
psd varchar(64) デフォルト null
/*psd mediaint DEFAULT 0 ランダム データを保存します*/
)ENGINE=MyISAM デフォルトの文字セット=utf8;
/*MYISAM ストレージ エンジンはエンジン トランザクションを生成せず、データ挿入速度が非常に高速です。数千万のテスト データを迅速に挿入するため、データを挿入した後、ストレージ タイプを InnoDB に変更します*/


-- 2. ストアド プロシージャを作成し、データを挿入します。
区切り文字 $$
`xscj`$$ を使用する
`insert_data`$$ が存在する場合はプロシージャを削除
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_data`(IN num INT)
始める
DECLARE n INT DEFAULT 1;/*現在の実行時間を保存する変数を定義します*/
WHILE n <= num
する
  INSERT INTO Index_test(USER,psd) VALUES(concat('user',n),password(n));/*concat() 文字列接続、PASSWORD() 暗号化関数*/
  /*INSERT INTO index_test(USER,psd) VALUES(CONCAT('用户',n),ret_pwd());*/
n=n+1 を設定します。
途中で終了します。
終了$$
区切り文字 ;


-- 3. パスワードをランダムに生成し、それを pwd フィールドに返す関数を作成します。
区切り文字 $$

作成する
    /*[DEFINER = { ユーザー | 現在の使用者 }]*/
    関数 `xscj`.`ret_pwd`()
    戻り値 int(5)
    /*言語SQL
    | [そうではない] 決定的
    | { SQL を含む | SQL はありません | SQL データを読み取る | SQL データを変更します }
    | SQL セキュリティ { 定義者 | 呼び出し者 }
    | コメント '文字列'*/
    始める
DECLARE r int デフォルト 0;
SET r = フロア(10+ランド()*1000);
r を返します。
    終了$$

区切り文字 ;

-- 4. ストアド プロシージャを呼び出し、100 万個のデータを挿入します (合計時間: 6 分 35 秒)
CALL 挿入データ(10000000);

-- 5. このステップは無視できます。エンジン変更(実行時間:2分49秒、送信時間:1.078秒、合計時間:2分51秒)
ALTER TABLE `index_test` ENGINE=INNODB;

-- 6. 通常のインデックスを使用せずに、主キー インデックスを介してクエリを実行します (合計所要時間: 0.022 秒)
SELECT * FROM インデックステスト WHERE id='1950000';

-- 7.不通过索引查询(总耗时:7.058 sec)
SELECT * FROM index_test WHERE USER='用户1950000'

-- 8.为USER字段创建普通索引,并通过该索引进行查询
CREATE INDEX index_user ON index_test (USER ASC);-- (总耗时:1 min 20 sec)
SELECT * FROM index_test WHERE USER='用户1950000';-- (总耗时:0.078 sec)

-- 9.使用user、pwd联合查询,由于user添加了索引,pwd未添加索引,故进行筛选查询是仍旧采用全表扫描,因此时间略有提升(总耗时:7.086 sec)
SELECT * FROM index_test WHERE USER='用户1950000' OR psd='*B810355CF0690506E5295AA66741D44E6AF4E61D';

-- 10.对user、pwd字段创建聚合索引后,再查询
CREATE INDEX index_userpwd ON index_test (USER,psd ASC);-- (总耗时:2 min 25 sec)
SELECT * FROM index_test WHERE USER='用户1950000' OR psd='*B810355CF0690506E5295AA66741D44E6AF4E61D';-- (总耗时:13.014 sec)


-- 查看表结构
DESC index_test;
-- 查询表数据
SELECT * FROM index_test;
-- 删除表数据
DELETE FROM index_test;
-- 删除索引
DROP INDEX index_user ON `index_test`;
DROP INDEX index_userpwd ON `index_test`;

おすすめ

転載: blog.csdn.net/youcheng_ge/article/details/77728189