MyISAM和Innodb索引的区别(转)
来源:互联网 发布:淘宝u站推广 编辑:程序博客网 时间:2024/05/15 21:05
1 MyISAM默认使用B-tree索引只把索引载入内存,数据缓存依赖于操作系统,InnoDB使用聚集索引实际上是在
同样的结构中保存了B-tree索引和数据行。把索引和索引的数据都载入内存缓冲 。Innodb是按照主键(primary
key)进行聚集,被索引的列其实是主键列,如果没定义主键,Innodb会试着使用唯一非空索引Unique Index来代替,
如果还找不到,Innodb就会定义隐藏主键然后在上面进行索引聚集。出了主键的聚集索引,其他索引中不会保存
行的物理位置,而是保存主键的值,所以通过"第二索引"进行查找是先找到主键,再找到行,要进行二次索引查找。
2 MyISAM数据库中的数据是按照插入的顺序保存,在每个索引节点中保存对应的数据行的地址,理论上说主键
索引和其他索引是一样的,InnoDB数据库中的数据和主键节点保存在一起,所有其他索引节点中保存的是主键
索引的值。
3 对于字符串索引,MyISAM默认采用增量保存,例如第一个索引值是'perform',第二个索引的值
是'performance', 在索引文件中第二个索引被保存为'7,ance'。这样能够减小索引的尺寸。
4 MyISAM保存索引的状态信息在磁盘里,每次执行ANALYZE TABLE会更新这个信息。InnoDB则通过在启动的
时候随机读取索引来估计索引的状态信息,所以Show Index的结果对于MyISAM是精准的,但对于InnoDB不是
绝对精准。
5 索引长期运行之后会产生碎片,一种碎片是一行数据被保存在不同的数据段,另一种是连续的表空间或行在
磁盘上被分散地保存。对于MyISAM两种索引碎片都会出现,对于InnoDB只会出现后一种因为InnoDB不会把短
行保存到不同的数据段。要消除索引碎片一种方法是OPTIMIZE TABLE,另一种方法是把数据重新导入。 对于不
支持 OPTIMIZE TABLE 的存储引擎可以使用误操作的ALTER TABLE重新建立表,可以使用当前的存
储引擎:ALTER TABLE <table> ENGINE=<engine>
针对MyISAM和InnoDB不同的索引结构,要注意以下几点:
1 在InnoDB表中插入数据一定要尽可能按照主键增加的顺序,AUTO_INCREMENT最好,这样插入的速度最
快,如果没有按照主键顺序插入数据,在插入后最好使用OPTIMIZE TABLE重新组织表。
2 因为InnoDB索引节点中保存的是主键的值,所以主键的值越简单越好。
3 对于InnoDB表,在查询的时候如果只需要查找索引列,就不要加入其它列,这样速度最快。
4 MyISAM和Innodb的B-tree索引支持前缀索引,有最左匹配原则。
(http://www.cyrec.org/posts/myisam-innodb-index)
- MyISAM和Innodb索引的区别(转)
- <转>MyISAM和InnoDB的索引实现
- MyISAM 和 InnoDB 中索引使用的区别
- InnoDB和MyISAM的区别
- InnoDB和MyISAM的区别
- MyISAM和InnoDB的区别
- MyISAM和InnoDB的区别
- MyISAM 和 InnoDB 的区别
- MyISAM和InnoDB的区别
- InnoDB和MyISAM的区别
- InnoDB和MyISAM的区别
- innodb和myisam的区别
- InnoDB和MyISAM的区别
- InnoDB和MyISAM的区别
- MyISAM和InnoDB的区别
- MyISAM 和 InnoDB 的区别
- MyISAM和InnoDB的区别
- InnoDB和MyISAM的区别
- PHP文件上传大小限制修改
- Android命令行工具logcat详细用法!
- IOS 知识收集
- “C++的数组不支持多态”?
- ARM伪指令
- MyISAM和Innodb索引的区别(转)
- gisall好友列表
- 联想Thinkpad e40 取消 fn + f1 功能 默认 f1~ f12
- Java NIO 实现进程通讯,解决用户自定义数据的组包和拆分粘包的问题
- html <area coords>
- Java MD5加密程序
- BMP 头文件格式
- 实现软件自动升级
- 浅谈JNDI的使用