当前位置:Gxlcms > mysql > mysql聚簇索引的页分裂原理实例分析

mysql聚簇索引的页分裂原理实例分析

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

本文实例讲述了mysql聚簇索引的页分裂。分享给大家供大家参考,具体如下:

在MySQL中,MyISAM采用的是非聚簇索引的,InnoDB存储引擎是采用聚簇索引的。

聚簇结构的特点:

  • 根据主键查询条目时,不用回行(数据就在主键节点下)
  • 如果碰到不规则数据插入时,造成频繁的页分裂

为什么会产生页分裂?

这是因为聚簇索引采用的是平衡二叉树算法,而且每个节点都保存了该主键所对应行的数据,假设插入数据的主键是自增长的,那么根据二叉树算法会很快的把该数据添加到某个节点下,而其他的节点不用动;但是如果插入的是不规则的数据,那么每次插入都会改变二叉树之前的数据状态。从而导致了页分裂。

测试:

创建2张表

  1. create table t8(
  2. id int primary key,
  3. c1 varchar(500),
  4. c2 varchar(500),
  5. c3 varchar(500),
  6. c4 varchar(500),
  7. c5 varchar(500),
  8. c6 varchar(500)
  9. ) engine innodb charset utf8;
  10. create table t9(
  11. id int primary key,
  12. c1 varchar(500),
  13. c2 varchar(500),
  14. c3 varchar(500),
  15. c4 varchar(500),
  16. c5 varchar(500),
  17. c6 varchar(500)
  18. ) engine innodb charset utf8;

写一个php脚本,用于插入1W条无规则的主键数据和1W条规则的主键数据,来看看区别。

  1. <?php
  2. set_time_limit(0);
  3. $conn = mysql_connect('localhost','root','1234');
  4. mysql_query('use test;');
  5. //自增长主键
  6. $str = str_repeat('a', 500);
  7. $startTime = microtime(true);
  8. for($i=1;$i<=10000;$i++){
  9. mysql_query("insert into t8 values($i,'$str','$str','$str','$str','$str','$str')");
  10. }
  11. $endTime = microtime(true);
  12. echo $endTime-$startTime.'<br/>';
  13. //无序的主键
  14. $arr = range(1, 10000);
  15. shuffle($arr);
  16. $startTime = microtime(true);
  17. foreach($arr as $i){
  18. mysql_query("insert into t9 values($i,'$str','$str','$str','$str','$str','$str')");
  19. }
  20. $endTime = microtime(true);
  21. echo $endTime-$startTime.'<br/>';

测试结果图

1W条规则的数据:998秒 = 16分钟
1W条不规则的数据:1939秒 = 32分钟

结论:

聚簇索引的主键值,应尽量是连续增长的值,而不是要是随机值, (不要用随机字符串或UUID),否则会造成大量的页分裂与页移动。在使用InnoDB的时候最好定义成:

id int unsigned primary key auto_increment

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL索引操作技巧汇总》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

您可能感兴趣的文章:

  • mysql建立高效的索引实例分析
  • mysql重复索引与冗余索引实例分析
  • mysql索引覆盖实例分析
  • mysql索引对排序的影响实例分析
  • MySQL中NULL对索引的影响深入讲解
  • 详解MySQL索引原理以及优化
  • 通过唯一索引S锁与X锁来了解MySQL死锁套路
  • mysql 添加索引 mysql 如何创建索引
  • MySQL索引类型总结和使用技巧以及注意事项
  • MySQL查看、创建和删除索引的方法
  • MySQL 创建索引(Create Index)的方法和语法结构及例子

人气教程排行