MySQL de optimización de datos masivos

         En general, cuando tenemos una gran cantidad de datos, entonces usted necesita para ser paginado, declaración general paginado es el desplazamiento límite, filas. Esta pequeña cantidad de datos cuando la paginación es nada del impacto, una vez compensado con el aumento de cantidad de datos aumenta, el rendimiento será cada vez peor. Aquí nos encontramos con el siguiente experimento:

  1. preparar los datos
    1. Construir una tabla de prueba del motor es MyISAM (inserto no hay datos de las transacciones enviadas, insertar velocidad rápida) mesa.  
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. Escribir un procedimiento de inserción masiva almacenado
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);

Insertar datos de 100w

  1. rendimiento de la prueba          Aquí nos dirigieron a otro compensado igual al valor real: offset igual a 10.000 cuando se consume

 

  • offset igual a 100000 consumo

 

 

  • offset igual a 1000000 consumo

 

  • offset igual a 5 millones al consumir

 

 

  • offset igual a 10.000.000 consumo

 

 

De la gráfica se puede dibujar con el valor de la compensación del tiempo cada vez más mayor. Esto es sólo 1000w datos, lo mal que la eficiencia de cientos de millones de datos si lo hacemos, podemos imaginar en este momento de la consulta. Vamos a ser optimizado.

4. optimización

   La paginación sub-consulta:

 

 

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

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

REGISTRARSE la paginación:

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

manera de unirse a la actuación sub-consulta un poco mejor.

Última optimización:

Este rendimiento es el mejor momento. Uno de los más importantes de optimización de consulta de identificación debe confiar en este frente, si es el tipo de paginación directa puede especificar el número de páginas no es suficiente, debe ser el único, por lo que después de un clic.

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

Paginación de la columna de la pseudo-ID, se puede consultar varios subprocesos al mismo tiempo, el importe total de la página de datos de carga en la memoria caché.

Para dar una gama de 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

seleccionar * de usuario donde id> 0 y id <= 5000, hasta un máximo de Identificación

Publicado 55 artículos originales · ganado elogios 31 · Vistas a 80000 +

Supongo que te gusta

Origin blog.csdn.net/zengfanwei1990/article/details/105320440
Recomendado
Clasificación