MyISAM和innoDB对比,覆盖索引简单回顾

本文深入解析了MySQL中的两种主要存储引擎MyISAM与InnoDB的特点与区别,包括它们的支持特性、锁机制、磁盘存储方式及适用场景,帮助读者理解何时选择哪种引擎以优化数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyISAM

Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。

它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。

myisam只支持表级锁。

支持FULLTEXT类型的索引

DELETE 表时,是一行一行的删除

 

myisam在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型。

.frm 用于存储表的定义

.MYD 用于存放数据

.MYI 用于存放表索引

InnoDB

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全,包括ACID事务支持。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

Innodb支持行级锁。

不支持FULLTEXT类型的索引

DELETE 表时,先drop表,然后重建表

选择

因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。

如果系统读少,写多的时候,尤其是并发写入高的时候。InnoDB就是首选了。

覆盖索引

解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。

解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引。

解释三:是非聚集组合索引的一种形式,它包括在查询里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆盖查询语句[select子句]与查询条件[Where子句]中所涉及的字段,也即,索引包含了查询正在查找的所有数据)。

不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引

 

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。

只扫描索引而无需回表的优点:

    1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。

    2.因为索引是按照列值顺序存储的,所以对于IO密集的范围查找会比随机从磁盘读取每一行数据的IO少很多。

    3.一些存储引擎如myisam在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用

    4.innodb的聚簇索引,覆盖索引对innodb表特别有用。(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询)

判断标准:

 在查询前面使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。

转载于:https://www.cnblogs.com/csuliujia/p/10768264.html

<think>好的,我现在需要回答用户关于MySQL索引类型、方法及其区别的问题。首先,我需要回顾之前提供的引用内容,确保信息准确。根据引用[1]引用[2],索引类型主要有普通索引、唯一索引、全文索引,而引用[3]提到了组合索引,引用[4]讨论了InnoDB的聚簇索引哈希索引。用户的问题集中在类型、方法区别上。首先,我需要明确索引类型索引方法的不同。索引类型指的是索引的作用,如普通、唯一等,而索引方法指的是底层实现的技术,如B-Tree、Hash等。引用[4]提到了B+TreeHash,所以这里需要区分清楚。 接下来,要整理各个索引类型的特点。普通索引用于加速查询,允许重复;唯一索引保证唯一性;全文索引处理文本搜索;组合索引涉及多列。然后,索引方法部分,B-Tree适用于范围查询,Hash适合等值查询,但只支持Memory引擎。聚簇索引辅助索引的区别在引用[4]中有详细说明,需要解释清楚。还要注意用户可能混淆类型方法,比如NORMAL在MySQL中并不是官方术语,引用[2]提到这一点,需要指出。组合索引的使用注意事项,如最左前缀原则,引用[3]提到,必须包含第一列否则失效,这点要强调。 区别方面,聚簇索引普通索引的数据存储方式不同,InnoDB的主键索引是聚簇索引,数据文件本身就是索引,而辅助索引存储主键值。哈希索引B+树的优缺点对比,比如哈希不支持排序范围查询,但查询速度快。 最后,生成相关问题时要覆盖常见疑问,比如如何选择索引类型,聚簇索引的优势,组合索引的使用技巧,哈希索引的适用场景,以及索引维护的最佳实践。确保问题能够帮助用户深入理解索引的应用优化。</think>### MySQL索引类型、方法及区别解析 #### 一、索引类型(按功能分类) 1. **普通索引(Normal Index)** - 作用:加速查询,无唯一性约束,允许重复值 - 语法:`CREATE INDEX idx_name ON table(column)` - 场景:频繁查询的非唯一字段,如商品分类ID[^1][^2] 2. **唯一索引(Unique Index)** - 作用:保证字段唯一性,同时提升查询速度 - 语法:`CREATE UNIQUE INDEX idx_name ON table(column)` - 限制:插入/更新时会验证唯一性,影响写入性能[^1] 3. **全文索引(Full-Text Index)** - 作用:支持自然语言文本搜索(如关键词匹配、语义分析) - 语法:`CREATE FULLTEXT INDEX idx_name ON table(column)` - 引擎限制:仅MyISAMInnoDB支持[^1][^3] 4. **组合索引(Composite Index)** - 作用:多字段联合索引,优化复杂查询条件 - 语法:`CREATE INDEX idx_name ON table(col1,col2)` - 关键规则:**最左前缀原则**,若查询未包含第一列则索引失效[^3] #### 二、索引方法(底层实现技术) 1. **B+Tree(默认方法)** - 特点: - 多叉平衡树结构,支持范围查询(`>`, `<`, `BETWEEN`) - 数据有序存储,适合排序操作 - 叶子节点形成链表,加快范围扫描速度 - 适用场景:90%以上的常规查询[^4] 2. **Hash索引** - 特点: - 基于哈希表实现,仅支持等值查询(`=`) - 查询时间复杂度O(1) - 不支持排序部分匹配查询(如`LIKE 'abc%'`) - 限制: - 仅Memory引擎显式支持 - InnoDB的自适应哈希索引是内部机制,用户不可控[^4] 3. **聚簇索引(Clustered Index)** - 实现特点: - InnoDB主键索引即聚簇索引,数据与索引存储在一起 - 叶节点直接存储行数据,主键值决定了数据物理顺序 - 辅助索引的data域存储主键值而非地址[^4] - 设计建议: - 主键应短小且单调(推荐自增整型) - 避免使用UUID等无序长字段作为主键 #### 三、核心区别对比 | 对比维度 | B+Tree索引 | Hash索引 | |----------------|-------------------------------|-----------------------------| | 查询类型支持 | 等值、范围、排序 | 仅等值查询 | | 磁盘I/O效率 | 高度优化的层级结构 | 需要加载整个桶 | | 数据更新成本 | 平衡树结构调整 | 需重建哈希表 | | 典型应用场景 | 订单时间范围查询、姓名排序查找 | 内存临时表的高速等值匹配 | #### 四、最佳实践建议 1. **索引选择策略** - 高筛选率字段优先建索引(如`user_id`) - 避免对低区分度字段建索引(如`gender`) - 组合索引字段顺序:高频查询字段在前 2. **写入性能权衡** - 单表索引建议不超过5个 - 频繁更新的字段谨慎建索引 3. **特殊场景优化** - 分页查询深翻页:`WHERE id > 10000 LIMIT 20` - 前缀索引:`ALTER TABLE t ADD INDEX idx(email(10))` - 覆盖索引:`SELECT name FROM users WHERE age=25`需建`(age,name)`索引 ```sql -- 示例:创建组合索引 ALTER TABLE orders ADD INDEX idx_composite (user_id, order_date); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值