当前位置:Gxlcms > 数据库问题 > MySQL 大致测试更新时间

MySQL 大致测试更新时间

时间:2021-07-01 10:21:17 帮助过:2人阅读

  1. DROP TABLE IF EXISTS test20;

  

  1. CREATE TABLE test20(
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. money DOUBLE,
  4. createdtime DATETIME)ENGINE=INNODB DEFAULT CHARSET=UTF8;

  

  1. DROP PROCEDURE IF EXISTS pro_test20;
  2. DELIMITER &&
  3. CREATE PROCEDURE pro_test20(IN inr int)
  4. BEGIN
  5. DECLARE i INT DEFAULT 0;
  6. START TRANSACTION;
  7. WHILE i<inr DO
  8. INSERT INTO test20(money,createdtime) values(234567891023,‘2014-06-22 20:18:38‘);
  9. SET i=i+1;
  10. END WHILE;
  11. COMMIT;
  12. END &&
  13. DELIMITER ;

 

  1. mysql> call pro_test20(10000000);
  2. Query OK, 0 rows affected (4 min 50.37 sec)

  

  1. mysql> call pro_test20(10000000);
  2. Query OK, 0 rows affected (8 min 18.97 sec)

  

  1. #20次
  2. INSERT INTO test20(money,createdtime) values(234567891023,‘2013-03-33 20:18:38‘);
  1. mysql> INSERT INTO test20(money,createdtime) values(234567891023,‘2013-03-03 20:18:38‘);
  2. Query OK, 1 row affected, 1 warning (0.02 sec)
  1. UPDATE test20 SET money=money+10000000,createdtime=now()
  2. WHERE createdtime=‘2013-03-03 20:18:38‘;

 

  1. mysql> UPDATE test20 SET money=money+10000000,createdtime=now() WHERE id BETWEEN 200000 AND 200020;
  2. Query OK, 21 rows affected (0.01 sec)
  3. Rows matched: 21 Changed: 21 Warnings: 0
  4. mysql> UPDATE test20 SET money=money+10000000,createdtime=now() where id in (36,457,67842,21,324,68,23,12,345,547,56,234,7263,233525,252522,3523,76666,1231,54);
  5. Query OK, 19 rows affected (0.05 sec)
  6. Rows matched: 19 Changed: 19 Warnings: 0

  

  

 

 

 

1:需求:把一个2千万条数据的一个表,随机更新其中的一千行需要大致多久?

存储过程测试1:(效率很低)

  1. DROP PROCEDURE IF EXISTS pro_tab1000;
  2. DROP TABLE IF EXISTS tab_test20;
  3. CREATE TABLE tab_test20(id int)ENGINE=INNODB DEFAULT CHARSET=UTF8;
  4. DELIMITER &&
  5. CREATE PROCEDURE pro_tab1000(IN inr int)
  6. BEGIN
  7. DECLARE i INT DEFAULT 0;
  8. WHILE i<inr DO
  9. INSERT INTO tab_test20 SELECT floor(RAND() * (SELECT MAX(id) FROM test20));
  10. SET i=i+1;
  11. END WHILE;
  12. END &&
  13. DELIMITER ;
  14. CALL pro_tab1000(1000);
  15. UPDATE test20 SET money=money+10000000,createdtime=now() WHERE id in (SELECT DISTINCT id FROM tab_test20);

  

存储过程测试2:2s

  1. DELIMITER &&
  2. DROP PROCEDURE IF EXISTS pro_test1000;
  3. CREATE PROCEDURE pro_test1000(IN inr int)
  4. BEGIN
  5. DECLARE i INT DEFAULT 0;
  6. DECLARE j INT ;
  7. SELECT FLOOR(RAND()*(SELECT MAX(id) FROM test20)) into j;
  8. WHILE i<inr DO
  9. UPDATE test20 SET money=money+10000000,createdtime=now() WHERE id = j;
  10. SET i=i+1;
  11. END WHILE;
  12. END &&
  13. DELIMITER ;

  

效率很低的语句:

  1. SELECT id FROM test20 ORDER BY rand() LIMIT 10

  

  1. mysql> SELECT id FROM test20 ORDER BY rand() LIMIT 10;
  2. +----------+
  3. | id |
  4. +----------+
  5. | 1876355 |
  6. | 10266755 |
  7. | 14746331 |
  8. | 17533398 |
  9. | 8164806 |
  10. | 8438406 |
  11. | 12884382 |
  12. | 17285257 |
  13. | 9817314 |
  14. | 10273314 |
  15. +----------+
  16. 10 rows in set (26.67 sec)

  

 

 

问题1:更新记录很多的时候,字段上有索引快还是没有索引快?

 

MySQL 大致测试更新时间

标签:

人气教程排行