MySQLの最適化、大規模なデータ

         一般的に、我々は大量のデータを持っている場合、その後、あなたがページングする必要がある、一般的な文は、行オフセットの限界であるページング。ページングが衝撃の何もないこの少量のデータは、一度データ増加の量を増やすと、パフォーマンスが悪化することになるとオフセット。ここでは、次の実験に来ます:

  1. データを準備します
    1. テストテーブルエンジンを構築するテーブル(速いスピードを挿入し、データが送信一切のトランザクションを挿入しない)MyISAMテーブルです。  
CREATE TABLE USER (
id INT ( 20 ) NOT NULL auto_increment,
NAME VARCHAR ( 20 ) NOT NULL,
address VARCHAR ( 20 ) NOT NULL,
PRIMARY KEY ( id ) 
) ENGINE = MyISAM;
  1. 一括挿入ストアドプロシージャを書きます
delimiter //
# 删除表数据
TRUNCATE TABLE t;
# 如果已经有sp_test_batch存储过程,将其删除,后面重新创建
DROP PROCEDURE IF EXISTS sp_test_batch;
# 创建存储过程,包含num和batch输入,num表示插入的总行数,batch表示每次插入的行数
CREATE PROCEDURE sp_test_batch(IN num INT,IN batch INT)
BEGIN
	SET @insert_value = '';
	# 已经插入的记录总行数
  SET @count = 0;
	# 
	SET @batch_count = 0;
	WHILE @count < num DO
		# 内while循环用于拼接INSERT INTO t VALUES (),(),(),...语句中VALUES后面部分
		WHILE (@batch_count < batch AND @count < num) DO
			IF @batch_count>0
			THEN 
				SET @insert_value = concat(@insert_value,',');
			END IF;
			SET @insert_value = concat(@insert_value,"('name", @count, "','address", @count, "')");
			SET @batch_count = @batch_count+1;	
		END WHILE;
 
		SET @count = @count + @batch_count;
		# 拼接SQL语句并执行
		SET @exesql = concat("insert into user(name,address) values ", @insert_value);	
		PREPARE stmt FROM @exesql;
		EXECUTE stmt;
		DEALLOCATE PREPARE stmt;
		# 重置变量值
		SET @insert_value = '';
		SET @batch_count=0;
	END WHILE;
	# 数据插入完成后,查看表中总记录数
	SELECT COUNT(id) FROM user;
END
CALL sp_test_batch(10000000,10000);

挿入データ100ワット

  1. テストのパフォーマンス          がかかる時に、オフセット等しい10000:ここでは、さまざまに向けられていたが、実際の値に等しいオフセット

 

  • かかる100000に等しいオフセット

 

 

  • 1000000消費に等しいオフセット

 

  • 消費したときに500万に等しいオフセット

 

 

  • 10,000,000消費に等しいオフセット

 

 

グラフから長い時間がかかり、より多くのそれをオフセットの値で描画することができます。これは、我々がしなければ、我々は、クエリのこの時点で想像することができますどのように悪いデータの何百万、数百の効率化だけで千ワットのデータ、です。のは、最適化されてみましょう。

4.最適化

   ページネーションサブクエリ:

 

 

SELECT * FROM user WHERE  id >=  
(SELECT id FROM user  ORDER BY id LIMIT 9000000, 1) LIMIT 10

从图可以得出子查询确实速度快了一倍。

ページネーションを登録しよう:

SELECT * FROM user t1 INNER join
(SELECT id FROM user  ORDER BY id LIMIT 9000000, 10) t2 on t2.id =t1.id

少し良くサブクエリのパフォーマンスに参加するより方法。

究極の最適化:

この性能は、最高の時間です。最大のIDのクエリの最適化の一つ、それが直接のページングのようなものであれば、この前に頼らなければならないが、十分ではありませんどのように多くのページを指定することができますので、クリックした後、一つだけである必要があります。

SELECT id FROM user  where id > 9000000 ORDER BY id  LIMIT 10;

疑似ID列の改ページ、あなたは、同時にキャッシュにデータをロードするために、ページの全額を複数のスレッドを照会することができます。

IDの範囲を与えるために、


select id from(
SELECT @rownum:=@rownum+1 AS rownum, id FROM   user as t1 ,(SELECT @rownum:=0) t2 order
by t1.id asc
) t3 where t3.rownum%5000=0

*利用者から場所ID> 0とid <= 5000までのIDの最大値に選択

公開された55元の記事 ウォン称賛31 ビュー80000 +

おすすめ

転載: blog.csdn.net/zengfanwei1990/article/details/105320440