myisam和innodb的索引有什么区别?

两个索引都是B+树索引,但是myisam的表存储和索引存储是分开的,索引存储中存放的是表的地址。而innodb表存储本身就是一个B+树,它是用主键来做B+树的key的。

因此innodb需要设置主键,如果没有的话,mysql会优先使用unique键做主键,如果没有unique的话,会生成一个隐含字段做主键。

innodb中的主键最好是要使用自增id,因为这样当进行插入操作的时候是不需要修改表的存储结构的。

innodb的辅助索引key是辅助索引,而value则是主键。那么这样的话,innodb中主键如果是md5之类的字符串的话,那么每个辅助索引的磁盘空间就占用很大,而且也有前一条的问题,当插入操作的时候还需要修改表结构。

覆盖索引

由于innodb的辅助索引带主键的机制就导致一种“覆盖索引”的使用。就是只需要在辅助索引中就可以进行到值查找而不需要进行查表。比如一个InnoDB表student字段有uid(主键),username,age。其中建立一个辅助索引username,那么如果你希望查找一个学生名为yejianfeng的学生是否存在:

select id from student where username=”yejianfeng”  (这个查询语句是使用到覆盖索引的,它只会去索引中进行一次查找,而不会查表,当然如果这个表是myisam表的话,就不会覆盖索引了)

select * from student where username=”yejianfeng”  (这个查询是使用不到覆盖索引的,它会去索引查找一次,然后根据主键id去表中再查找一次。所以说不要滥用*)

索引选择性

索引选择性是建立索引的参考指标,指的是该字段可选择的非重复项在总条数中占的比例。比如说一个表中有100000的条数,有个字段是性别字段,这个性别它只有两个选择,所以它的索引选择性就是2/100000 ~ 0.00002,那么这种情况下,我们就没必要再给这个字段单独加个索引。原因是当选择性太小的话,比如我进行一次查询查出来的100条中有50条是符合查询结果的,相比于选择性大的情况,我进行一次查询查出来的100条中只有5条是符合查询结果的,那么后一种建立索引让索引查询出来的结果变小的效果明显更大。而考虑到索引也占用资源以及增删操作的成本,选择性太小的字段就没有建立索引的必要了。

谈Mysql索引的更多相关文章

  1. 浅谈MySQL索引背后的数据结构及算法

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  2. 浅谈MySQL索引背后的数据结构及算法(转载)

    转自:http://blogread.cn/it/article/4088?f=wb1 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储 ...

  3. 浅谈MySQL索引背后的数据结构及算法【转】

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  4. 再谈MySql索引

    一.索引简介 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引(主键索引.唯一索引.普通索引)和组合索引.单列索引,即一个索引只包含单个列 ...

  5. 浅谈Mysql索引

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...

  6. 浅谈 Mysql 中的索引

    文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...

  7. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  9. (转)运维角度浅谈MySQL数据库优化

    转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...

随机推荐

  1. Swift 必备开发库 (高级篇)

    1.CryptoSwift swift加密库, 支持md5,sha1,sha224,sha256... github地址: https://github.com/krzyzanowskim/Crypt ...

  2. Android开源源码推荐(一)

    1.Android-ViewPagerIndicator http://www.akaifa.com/code/86/android-viewpagerindicator 实现各种样式的滑动视图(Sc ...

  3. Redis监控技巧(转)

    来自:http://blog.nosqlfan.com/html/4166.html Redis 监控最直接的方法当然就是使用系统提供的 info 命令来做了,你只需要执行下面一条命令,就能获得 Re ...

  4. python3 crypto winrandom import error

    早就听说3的包很成熟了,自从从2.7过渡上来后还是碰到各种不适应,可以想象更早的时候问题该要多么多,特别一些必备库经典库如果没有跟进得多痛苦. [code lang="python" ...

  5. Base: 一种 Acid 的替代方案

    原文链接: BASE: An Acid Alternative Pdf下载链接: Base 数据库 ACID,都不陌生:原子性.一致性.隔离性和持久性,这在单台服务器就能搞定的时代,很容易实现,但是到 ...

  6. 转:TinyXM--优秀的C++ XML解析器

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...

  7. Linux--U盘安装Ubuntu12.04

    前言 最近一直在研究Android内核驱动开发的相关事宜,使用VMware虚拟机虽然可以更方便的开发,但是对于开发环境硬件的要求还是比较高的,若用于开发,效率太低了,所以考虑使用单独PC去装载Linu ...

  8. oracle导入导出小记

    问题:11.2.0.3.0 导入  11.2.0.2.0 都是oracle 11g ,从0.3.0到0.2.0 报错,以为是版本问题,结果不是 采用impdp 导入exp导出的文件会报错 所以改为im ...

  9. Lua截取utf-8编码的中英文混合字符串

    参考博客:UTF8字符串在lua的截取和字数统计[转载] 需求 按字面个数来截取子字符串 函数(字符串, 开始位置, 截取长度) utf8sub(,) = 好1世界哈 utf8sub(,) = 你好1 ...

  10. java生成解析xml的另外两种方法Xstream

    Xstream生成和解析xm和JAXB生成和解析xml的方法. 一,Xstream Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar 1. ...