博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈Mysql索引
阅读量:7048 次
发布时间:2019-06-28

本文共 1016 字,大约阅读时间需要 3 分钟。

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条是符合查询结果的,那么后一种建立索引让索引查询出来的结果变小的效果明显更大。而考虑到索引也占用资源以及增删操作的成本,选择性太小的字段就没有建立索引的必要了。

转载地址:http://kfzol.baihongyu.com/

你可能感兴趣的文章
windows上通过secureCRT和putty创建密钥登录
查看>>
Hive快捷查询:不启用Mapreduce job启用Fetch task
查看>>
Java面试题
查看>>
CentOS下MySQL主从同步配置
查看>>
jQuery替换内容
查看>>
空暇时候思考2('\0'等价于数字0还是字符0)
查看>>
英语词汇周计划(1-1)group 1
查看>>
FreeRTOS基础知识
查看>>
3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放
查看>>
关于逻辑或的一个小小应用注意点
查看>>
(一)Redis笔记——简介 、key 、数据类型
查看>>
第四篇:Web框架 - Django
查看>>
第九篇:随机森林(Random Forest)
查看>>
crontab命令详解
查看>>
高可用架构的6大常规方案【转】
查看>>
编程中的匈牙利命名法
查看>>
nj06---包
查看>>
Batch normalization:accelerating deep network training by reducing internal covariate shift的笔记
查看>>
Nginx/LVS/HAProxy负载均衡软件的优缺点详解
查看>>
Java -Xms -Xmx -Xss -XX:MaxNewSize -XX:MaxPermSize含义记录
查看>>