谈Mysql索引

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

时间: 2024-10-04 04:18:42

谈Mysql索引的相关文章

浅谈MySQL索引 实用又方便的方法

索引基础    索引的作用其实就是在MySQL中高效的获取数据.在数据库中,一般索引会很大,不可能全部储存在内存中,会是以文件形式存储在文件系统中.这样查询索引就会设计到磁盘I/O,而磁盘I/O相对于内存的读写速度差几个数量级,索引的目的即是减少一次查询中的磁盘I/O次数.而在计算机中,当做一次I/O操作时,在吧当前磁盘地址数据读取到内存中时,也会把相邻地址的数据读到内存中,这个是计算机中著名的局部性原理:当一个数据被用到时,其相邻地址的数据也通常会马上被使用.由于磁盘顺序读取的效率很高(不需要

运维角度浅谈MySQL数据库优化

  一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计   项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程

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

引用:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论. 文章

MySQL索引及查询优化总结 专题

  小结:db名与应用名相同,表名:业务名_此表的作用 ,表名表示内容,不体现数量,如果表示boolean概念,表名需要使用is_业务含义来表示,但POJO中不应该出现isXXX,因为不方便序列化,中间的对应关系,使用ResultMap来映射字段名中有多个单词,使用下划线连接,字段名不能以数字打着,数字和单词之间,只需要一个下划线,譬如xx_3xx,不建议写成xx_3_xx最左前缀原则    如果是联合索引,Btree索引在使用时受索引建立的字段顺序的影响where条件中有or,建议拆成unio

MySQL索引背后的数据结构及算法原理

看到的一篇关于MySql索引的介绍,感觉比较经典,直接转了. 本文转自张洋博客,原文链接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.为了避免混乱,本文将只关注于BTree索引,因为

从运维角度浅谈MySQL数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段:  1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团

浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解_Mysql

MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利 grant select on testdb.* to common_user@'%' grant insert on testdb.* to common_user@'%' grant update on testdb.* to common_user@'%' grant delete on testdb.* to c

【转载】运维角度浅谈MySQL数据库优化

 运维角度浅谈MySQL数据库优化 2015-06-02 14:22:02 标签:mysql优化   mysql分库分表分区 mysql读写分离 mysql主从复制 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lizhenliang.blog.51cto.com/7876557/1657465   一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈My

使用MYSQL索引

    关系数据库的世界是一个表与集合.表与集合上的运算占统治地位的世界.数据库是一个表的集合,而表又是行和列的集合.在发布一条SELECT 查询从表中进行检索行时,得到另一个行和列的集合.这些都是一些抽象的概念,对于数据库系统用来操纵表中数据的基本表示没有多少参考价值.另一个抽象概念是,表上的运算都同时进行:查询是一种概念性的集合运算,并且集合论中没有时间概念.当然,现实世界是相当不同的.数据库管理系统实现了抽象的概念,但是在实际的硬件    范围内要受到实际的物理约束.结牵檠ㄊ奔洌