浅聊 MySQL索引覆盖

浅聊 MySQL索引覆盖,第1张

尽量使用覆盖索引,减少select *。 那么什么是覆盖索引呢? 覆盖索引是指 查询使用了索引,并 且需要返回的列,在该索引中已经全部能够找到 。

现在有一张用户表tb_user

索引情况:

接下来,我们来看一组SQL的执行计划,看看执行计划的差别,然后再来具体做一个解析。

Using whereUsing Index:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需 要回表查询数据

Using index condition:查找使用了索引,但是需要回表查询数据

因为,在tb_user表中有一个联合索引 idx_user_pro_age_sta,该索引关联了三个字段 profession、age、status,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主 键id。 所以当我们查询返回的数据在 id、profession、age、status 之中,则直接走二级索引 直接返回数据了。 如果超出这个范围,就需要拿到主键id,再去扫描聚集索引,再获取额外的数据了,这个过程就是回表。 而我们如果一直使用select * 查询返回所有字段值,很容易就会造成回表 查询(除非是根据主键查询,此时只会扫描聚集索引)。

为了大家更清楚的理解,什么是覆盖索引,什么是回表查询,我们一起再来看下面的这组SQL的执行过 程。

id是主键,是一个聚集索引。 name字段建立了普通索引,是一个二级索引(辅助索引)。

B. 执行SQL : select * from tb_user where id = 2

根据id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。

C. 执行SQL:selet id,name from tb_user where name = 'Arm'

虽然是根据name字段查询,查询二级索引,但是由于查询返回在字段为 id,name,在name的二级索 引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。

D. 执行SQL:selet id,name,gender from tb_user where name = 'Arm'

由于在name的二级索引中,不包含gender,所以,需要两次索引扫描,也就是需要回表查询,性能相 对较差一点。

1、覆盖ib_logfile0和ib_logfile1会导致服务不能启动并报出1067的错误,这两个文件不应被覆盖,可以不存在,在启动服务时会自己创建这两个文件。

2、ibdata1则是真正的存在数据内容的文件,删除后再查询时就会报出表不存在的信息。

3、还有一个很重要且不能随便改动的文件是my.ini.通常需要对my.ini的修改是,可以在clientsection片段中修改客户端查询的编码为gbk;这样就解决了原来设置为utf-8时存在的客户端查询结果中汉字显示的乱码问题。

这个估计有困难,之前数据库应该是在c盘下(是win吗?)。

试试把硬盘挂到其他机子,用数据恢复工具找找mysql相关目录看吧,主要是mysq/data目录和其下的文件及子目录。运气好的话,没覆盖的情况能找出一些来,不一定完整。

如果装系统时又格式化过磁盘,需要找专业恢复人员了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7357788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存