mysql优化-------Myisam与innodb引擎,索引文件的区别
Myisam与innodb引擎,索引文件的区别:
innodb的次索引指向对主键的引用。
myisam的次索引和主索引都指向物理行。 myisam一行一行的插入,会产生一行一行的文件,磁盘上有数据文件。
tree树的值是磁盘上物理位置的指针。 比如加了主键索引,索引排成一棵树的形状。首先根据id=7在主键索引的树上查找,查找到7之后就知道了7所在的物理行,然后就可以找到id=7的那一行数据了。
还有一个cat_id索引,根据cat_id=15可以找到数据所在的物理行。
所以说myisam的次索引和主索引都指向物理行。


innodb的主键索引,数的每一个叶子下面,直接挂在了每行的数据,id=5的地方挂载的就是id=5的这行数据。数据就在叶子上,不用去磁盘上面查找。如果还有其他索引username,username=li的叶子下面放的是id=7.根据username索引这棵树上找到id=7然后在主键树上找到数据。
所以innodb的次索引指向对主键的引用。id的主索引成为聚簇索引,好处是根据主键查非常快,坏处是根据其他索引找的时候要多找一次主键这棵树。username是非聚簇索引。


innodb的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用。
myisam中, 主索引和次索引,都指向物理行(磁盘位置)。 注意: innodb来说,
1: 主键索引 既存储索引值,又在叶子中存储行的数据
2: 如果没有主键, 则会Unique key做主键
3: 如果没有unique,则系统生成一个内部的rowid做主键.
4: 像innodb中,主键的索引结构中,既存储了主键值,又存储了行数据,这种结构称为"聚簇索引" 聚簇索引
优势: 根据主键查询条目比较少时,不用回行(数据就在主键节点下)
劣势: 如果碰到不规则数据插入时,造成频繁的页分裂. myisam中对于索引文件是要放在内存中缓存起来的。节点会分裂:原来19的节点后来来了15和13,则19的位置换成13,并在下面添加15,19。对于聚簇索引就很严重。对于myisam没什么,对于innodb就很麻烦。

高性能索引策略
对于innodb而言,因为节点下有数据文件,因此节点的分裂将会比较慢.
对于innodb的主键,尽量用整型,而且是递增的整型.
如果是无规律的数据,将会产生的页的分裂,影响速度.
create table A{
id varchar(64) primary key,
ver int,
}
在id和ver上有联合索引10000条数据。
为什么select id from A order by id很慢
而select id from A order by id,ver很快
如果用的是myisam,那么都用到了索引覆盖,应该是一样都很快,有可能不实用的myisam引擎。myisam无论使用什么索引都是指向物理行的位置。
如果是innodb引擎,每个叶子下面直接放的数据,这些数据比较大内存放不下,就放在磁盘上。innodb的主键是聚簇索引。有比较长的列,聚簇索引导致沿id排序时要跨好多块。而且块比较多。所以查找很慢。
第二句是联合索引,联合索引没有放数据块(除了主键索引其余索引都指向主键索引,不带数据),而是放的是主键索引的位置指向id的值,不带有数据,文件比较小可以在内存中存放。现在只是取出id不用回行,就是在索引文件中取,而且索引文件比较小就放在内存中,所以很快。第一个语句,也只是在索引文件中查找,发生了索引覆盖,但是这个主键索引文件比较大,而且不一定在内存中,查找主键树的时候来回跳跃就很慢。
如果把数据比较大的字段去掉,速度也会提升,因为查找主键索引文件来回跳的时候就不会慢了。
通过下面的规律可以看出-----
1: innodb的buffer_page 很强大.
2: 聚簇索引的主键值,应尽量是连续增长的值,而不是要是随机值, (不要用随机字符串或UUID)
否则会造成大量的页分裂与页移动.
实验: 聚簇索引使用随机值导致页频繁分裂影响速度
过程:建立innodb表, 利用php连接mysql,
分别规则插入10000条数据,不规则插入10000条数据
观察时间的差异,体会聚簇索引,页分裂的影响. create table t5(
id int primary key,
c1 varchar(500),
c2 varchar(500),
c3 varchar(500),
c4 varchar(500),
c5 varchar(500),
c6 varchar(500)
) engine innodb charset utf8; create table t6(
id int primary key,
c1 varchar(500),
c2 varchar(500),
c3 varchar(500),
c4 varchar(500),
c5 varchar(500),
c6 varchar(500)
) engine innodb charset utf8; // testinnodb.php
$time_start = microtime_float(); $str = str_repeat('hello',100);
for($i=1;$i<=10000;$i++) {
$sql = "insert into t5 values ($i,'$str' , '$str' , '$str' , '$str' , '$str' , '$str'
)";
//echo $sql;
mysql_query($sql , $conn);
} $time_end = microtime_float();
echo 'seq insert cost' , ($time_end - $time_start) , "seconds\n";
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
} // rndinnodb.php
$base = range(1,10000);
shuffle($base); $time_start = microtime_float();
$str = str_repeat('hello',100);
foreach($base as $i) {
$sql = "insert into t6 values ($i,'$str' , '$str' , '$str' , '$str' , '$str' , '$str'
)";
//echo $sql;
mysql_query($sql , $conn);
} $time_end = microtime_float();
echo 'rand insert cost' , ($time_end - $time_start) , "seconds\n"; function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
|
字段数 |
混乱程度(步长) |
顺序1000条(秒数) |
乱序1000条(秒数) |
顺序写入page页数 |
乱序写入page数 |
|
1 |
1 |
54.365 |
53.438 |
62 |
91 |
|
10 |
1 |
53.413 |
62.940 |
235 |
1301 |
|
10 |
100 |
64.18 |
1329 |
||
|
10 |
1000 |
67.512 |
1325 |
通过上面的规律可以看出-----
1: innodb的buffer_page 很强大.
2: 聚簇索引的主键值,应尽量是连续增长的值,而不是要是随机值, (不要用随机字符串或UUID)
否则会造成大量的页分裂与页移动.
mysql优化-------Myisam与innodb引擎,索引文件的区别的更多相关文章
- MySQL的MyISAM与InnoDB的索引方式
在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 MyISAM引擎使用B+Tr ...
- MySQL中MyISAM和InnoDB引擎的区别
区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事 ...
- 关于MySQL的Myisam和Innodb的一些比较总结
总结一下MySQL的Myisam和Innodb引擎的一些差别,权当复习了. 首先二者在文件构成上: Myisam会存储三个文件:.frm 存储表结构,.MYD存储表的数据,.MYI文件存储表的索引:所 ...
- MySQL存储引擎MyISAM和InnoDB,索引结构优缺点
MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...
- MySQL中MyISAM和InnoDB两种主流存储引擎的特点
一.数据库引擎(Engines)的概念 MySQ5.6L的架构图: MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎.MySQL的所有逻辑概念,包括SQL ...
- 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现
重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...
- 【mysql中myisam和innodb的区别】
单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...
- 了解MyISAM与InnoDB的索引差异(转)
出处原文: 1分钟了解MyISAM与InnoDB的索引差异 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+ ...
- MySQL优化三(InnoDB优化)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
随机推荐
- CF dp 一句话解题
wyq说刚入门oi 或是遇到瓶颈的时候就刷DP吧,虽然觉得这么刷CF题有点浪费,但是还是挺爽的,按照solved排序做的,前面的题都挺水的(忘记记录了混蛋),就不写了,从5C开始写解题 CF5 C. ...
- 【强化学习】百度云BCC openai gym 环境配置
openai gym是RL算法的测试床.为了直观和便于调试,我们需要可视化界面.然而远程服务器使用openGL的问题比较棘手,这篇博客记录在百度云BCC上配置openai gym环境的注意事项. 按照 ...
- Hadoop 3.1.0 在 Ubuntu 16.04 上的安装过程
安装过程主要参考官方文档: http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/SingleCluster. ...
- 跳蚤 BZOJ 4310
跳蚤 [问题描述] 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最 ...
- zoj 2081 BFS 延迟标记 读入问题
Mission Impossible Time Limit: 2 Seconds Memory Limit: 65536 KB ...
- 关于gcc内置函数和c隐式函数声明的认识以及一些推测
最近在看APUE,不愧是经典,看一点就收获一点.但是感觉有些东西还是没说清楚,需要自己动手验证一下,结果发现需要用gcc,就了解一下. 有时候,你在代码里面引用了一个函数但是没有包含相关的头文件,这个 ...
- shell的while/for脚本的简单入门
shell的while/for脚本的简单入门 while [condition] dodone关键字break跳出循环,continue跳过循环的余下部分. for var in ...;do...d ...
- Golang中的panic和recover(捕获异常)
func panic(interface{})和func recover() interface{}是Golang中用于错误处理的两个函数. panic的作用就是抛出一条错误信息,从它的参数类型可以看 ...
- AC日记——租用游艇 洛谷 P1359
题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1& ...
- HDOJ 5213
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5213 BC 上的题,题解很清楚,会莫对的应该不难, 对于一个询问,我们拆成四个询问,开始拆成求区间矩形 ...