日期:2023-03-31 05:50:54 来源:脚本之家
索引可以有B-Tree索引,Hash索引。索引是在存储引擎中实现的
(资料图)
InnoDB / MyISAM 仅支持 B-Tree索引
Memory/Heap 支持B-Tree索引和Hash索引
B-Tree
B-Tree是一种非常适合用于磁盘操作的数据结构。它是一棵多路平衡查找树。其高度一般在2-4,其非叶子节点,叶子节点,都会存储数据。其所有的叶子节点,都在同一层。下图是一颗B-Tree
B+ Tree:B+树是在B-Tree基础上的一种优化。它和B树的主要区别在于:B+树的数据全部存储在叶子节点中,且叶子节点被一个链表串了起来。下图是一颗B+树InnoDB中一个页的大小为16KB(一个页即B+树上的一个节点),若表的主键为INT,大小为4字节,那一个节点也能够存储4K个键值,假设指针和键值都占相同大小,那么高度为3的B+树,第二层有2048个节点,第三层的叶子节点数为2048*2048 = 4194304,一个节点为16KB,则一共可容纳67108864KB,即65536MB,即64G的数据。
由于叶子节点是被一个链表串起来的,所以若order by 索引列,则默认已经是排好序的,所以效率会很高。
MyISAM索引
MyISAM的索引和数据是分开存放的。在MyISAM的主键索引中,B+树叶子节点里,存的是记录的地址,故MyISAM通过索引查询,需要经过2次IO
MyISAM的辅助索引和主键索引一样,唯一的区别是,辅助索引中的key可以重复,而主键索引的key不能重复
InnoDB索引
InnoDB的数据和索引是存放在一起的,又称聚集索引。数据通过主键索引,存放在主键索引B+树的叶子节点上。
InnoDB主键索引,数据已经包含在了叶子节点中,即索引和数据存放在一起,是为聚集索引。
InnoDB的辅助索引,叶子节点中存的是主键值,而不是地址。走辅助索引,需要检索2次。
InnoDB和MyISAM索引的区别:
InnoDB使用聚集索引,其主键索引叶子节点中直接存储了数据,而其辅助索引中叶子节点存的是主键的值
MyISAM使用非聚集索引,数据和索引不在同一个文件中,其主键索引中叶子节点上存的是该行记录所在的地址,其辅助索引中叶子节点上存的也是记录所在的地址,只是辅助索引的key可以重复,而主键索引的key不能重复
问题:
InnoDB为什么不要使用过长的字段做主键?
过长的主键,会使得辅助索引所占空间变得很大
为什么推荐InnoDB使用自增主键?
若使用自增主键,则每次插入新的记录,就会顺序的将新记录添加到当前索引节点的后续位置,一页写满了,才会进行开辟新的一页,这样使得索引结构很紧凑,且每次插入时不需要移动已有数据,非常高效。而如果不使用自增主键,则每次插入新记录时,都要选择一个插入位置,并且可能需要移动数据,使得效率不高,且索引结构不紧凑
为什么要用B+树,不用B树
CREATE INDEX index_name ON table_name(col_name); -- 或者 ALTER TABLE table_name ADD INDEX index_name(col_name)删除索引
DROP INDEX index_name ON table_name;
需要建立索引的场景
频繁作为查询条件的列,需建索引多表关联中,关联字段需建索引查询中排序的字段,需建索引不适用索引的场景
写多读少的表,不适合建索引频繁更新的字段,不适合建索引现有一张user表,其索引如下所示
其中name,age,address 三个字段作为一个组合索引
可以使用explain对某个SQL语句进行性能分析
explain select * from user where name = "am";
possible_keys
可能用到的索引
key
实际用到的索引
key_len
用于查询的索引的长度
ref
如果是等值查询,这里会会是const
rows
预计需要扫描的行数(不是精确值)
extra
额外信息,如
using wheretype
system : 表中只有1行数据,或空表
const : 使用唯一索引或主键索引,且用where等值查询,返回记录是1行,又叫唯一索引扫描
ref : 针对非唯一索引,使用等值where条件,或者最左前缀规则的查询。下面是满足了最左前缀规则,即对idx_name_age_add来说,满足了最左前缀,第一个索引为name
range:索引范围扫描,常见于>,<,between,in,like等查询注意like时,通配符%不能放在开头,否则会导致全表扫描
index : 没有完全匹配上索引,但不用回表查询的 all: 全表扫描,然后再在SQL Layer层过滤符合要求的记录explain select * from user where name = "y" and age = 15;
2. 最左前缀
组合索引中,查询条件要从组合索引的最左列开始,如上述example中组合索引idx_name_age_add,是建立在三个列name,age,address的,若跳过name,直接用age查询,则会变为全表扫描
explain select * from user where age = 15;
3. 不要在索引列上做计算
4. 范围条件右侧的索引列会失效
看到第一个SQL语句,没有用上addresss索引
5. 尽量使用覆盖索引
explain select name,age from user where name = "y" and age = 1;
可以避免回表查询
6. 索引字段不要使用不等(!= 或 <>),不要判断null(is null/ is not null)
会导致索引失效,转为全表扫描
7. 索引字段上使用like时,不要以%开头
8. 索引字段如果是字符串,记得加单引号
9. 索引字段不要用or
顺口溜:
全值匹配我最爱,最左前缀不放开。
带头大哥不能死,中间兄弟不能断。
索引列上不计算,范围查询后全断。
like百分号写最右,覆盖索引搞起来。
不等空值以及or,索引通通说拜拜。
到此这篇关于MySQL学习之索引及优化的文章就介绍到这了,更多相关MySQL索引及优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
标签:
MySQL学习之索引及优化 头条焦点
拉米罗·莫斯琴·贝内蒂
每日报道:波兰总理:欧盟2035年起禁售碳排放燃油小汽车是不可接受的
世界热推荐:天润乳业最新公告:2022年度净利润升31.33%至1.97亿元 拟10派1.87元
即时焦点:我市两乡村健身公园获评“省级最美”
华泰证券(06886)公布2022年业绩 归母净利约110.53亿元 同比减少17.18% 每10股派4.5元|环球看热讯
环球要闻:煌上煌:2022年净利同比降78.69% 拟10派0.15元
京威股份2022年净利润实现4.37亿元 同比上涨327.95%_世界最新
2023年河南省民族宗教事务委员会统一考试录用公务员面试资格确认公告|环球速看料
环球资讯:英搏尔:拟2025年前推出无稀土电机
热门看点:解锁春天~寻找潍坊“最in山东打卡地”!(NO.2)
全球观热点:Omdia:2022年三星在中小型尺 AMOLED占56%的总市场份额 京东方(000725.SZ)占12%
* 中国飞鹤跌超4%,营收净利现上市后首次双降
全球视点!头部车企加速收割市场,合资品牌“囚徒困境”加剧
每日动态!朗途留学 | 英国选校必看!2023QS排名前100的英国大学都有哪些优势专业?
皖能电力:收购议案获股东大会高票通过 全面推进企业战略转型 每日资讯
电台天线放家里可以吗(电视天线怎么放信号好) 环球速讯
我国的黄金珠宝市场,到底是由谁在占据着?-世界观察
萧山区举行职工运动会开幕式暨首届职工定向赛 天天热门
天天关注:深信服(300454):3月29日北向资金减持22.1万股
全球今热点:醉酒男子记不得家庭住址,民警驱车赶到现场
苹果手机对比安卓手机的优势(苹果手机对比) 天天速看
【环球时快讯】刚刚公布!福州将建超10个医疗集团!
今天最新消息 指尖舞动机械臂 细数中国空间站仪表与照明分系统黑科技
汤圆创作官网首页的小说去哪了_汤圆创作官网首页 今日热门