暂无图片
mysql创建索引后,没有使用上,explain仍然显示:Using filesort
我来答
分享
暂无图片 匿名用户
mysql创建索引后,没有使用上,explain仍然显示:Using filesort

create table `test1` (
`id` int not null auto_increment,
`videoid` int not null default 0,
`memid` int not null default 0,
primary key (`id`),
key `idx_videoid` (`videoid`)


插入1000条测试数据,

最开始


mysql> explain select * from test1 order by memid\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
filtered: 100.00
Extra: Using filesort


后来在memid 字段上创建索引之后,

mysql> show index from test1;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| test1 | 0 | PRIMARY | 1 | id | A | 1000 | NULL | NULL | | BTREE | | | YES | NULL |
| test1 | 1 | idx_videoid | 1 | videoid | A | 1000 | NULL | NULL | | BTREE | | | YES | NULL |
| test1 | 1 | idx_memid | 1 | memid | A | 1000 | NULL | NULL | | BTREE | | | YES | NULL |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+----


mysql> analyze table test1;
+------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------+---------+----------+----------+
| test.test1 | analyze | status | OK |
+------------+---------+----------+----------+
1 row in set (0.04 sec)

mysql> explain select * from test1 order by memid\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
filtered: 100.00
Extra: Using filesort

收集统计信息之后,怎么还是Using filesort ,并且索引也没有使用上?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
lianR

MySQL的排序有两种方式,一种是通过索引直接返回有序的结果集,另一种是通过文件排序(filesort)返回结果集。

在你的例子中,虽然你在memid字段上创建了索引,但是你的查询是“select  *”,也就是选择所有字段,这就导致了索引无法被使用。因为索引存储的是字段的值和这些值在表中的位置,如果查询的字段超过了索引的字段,那么MySQL就需要去原表中查找数据,这就导致了索引失效。

而且,你的查询语句中使用了order  by,这就需要MySQL进行排序。如果能通过索引直接返回有序的结果集,那么就不需要排序。但是在这个例子中,索引无法被使用,所以MySQL只能通过文件排序(filesort)来返回有序的结果集。

所以,如果你想让索引生效,你可以尝试只选择索引字段,比如“select  memid  from  test1  order  by  memid”,这样MySQL就可以通过索引直接返回有序的结果集,不需要进行文件排序。

暂无图片 评论
暂无图片 有用 1
打赏 0
everything

1、假设使用idx_memid索引获取数据,需要遍历idx_memid,再根据主键id回表查询;最终需要扫描两个索引树。
2、根据主键访问只需扫描一次全表后,内存排序。
1比2需要的io次数多一倍,io和memory的cost至少相差一个量级。肯定选2执行了。

暂无图片 评论
暂无图片 有用 1
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
Oracle迁移MySQL需要考虑什么?
回答 1
已采纳
1、语法不同的SQL改写2、多表关联改成尽可能单表3、运维能力具备mysqlOCP4、开发能力不能写复杂SQL以上为列举
ftwrl 的影响?
回答 1
本身不影响读操作,更新会被堵塞,但是有特殊情况,比如closecachedtables这步如果被其他事务阻塞(引用计数的版本号有旧版本),那么你这个操作本身就被阻塞了,然后其他查询也跟着阻塞了。
LOCK_MODE: X,GAP ,这种表示啥锁?
回答 1
,表示并列的意思(既…又).比如你createtable的时候字段间就是使用,隔开(update也是,别写成and哈).另一种是trxid10078lockmodeXlocksrecbutnotgap
mysql8.0 只有一个ibd文件如何恢复
回答 3
已采纳
1.在空库里面创建表2altertabletnamediscardtablsapce;3拷贝ibd文件到对应data目录4.altertabletnameimporttablespace;
mysql中的char和varchar如何区别?
回答 2
已采纳
char会分配固定的存储空间varchar是根据实际使用多少来分配存储空间char因为是固定长度,所以在存储和检索方面会快点。如果你存储的数据都是有固定长度的,这个可以建议用char如果存储数据的长度
请问各位大佬,mysql是否支持ipv4和ipv6双栈运行?
回答 1
已采纳
自MySQL5.0.3起,就开始支持IPv6连接。因此,较新的MySQL版本,如MySQL8.0等,都具备完善的IPv4和IPv6双栈运行能力。
mysql导入2.4g的sql文件花费了一上午,还没还原,有什么好办法吗?
回答 1
如果您的sql文件内容是insertinto这种方式的,那就只能等着了。如果能重新导出,建议做成txt纯数据格式。例如:使用loaddata或mysqlimport工具,百度一下或参考https://
关于dump-slave参数再从库执行时候的疑问?
回答 1
首先,概念和参数:–dumpslave是一个MySQL工具的选项,用于生成从服务器数据和复制相关的信息。当使用这个选项时,mysqldump将会为从服务器生成一个包含二进制日志位置和服务器ID的特定格
mysql如何定时备份数据库备份
回答 4
已采纳
您可以使用以下方法之一来定时备份MySQL数据库:使用mysqldump命令备份数据。在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据
mysql enterprise backup报错,大佬们能帮忙看看吗
回答 1
已采纳
你看报错哈,意思是需要设置compresssionalgorithm为1,你现在的设置是0,这个参数是从mysql8.0.18才有的,你的mysqlbackup工具是8.0.30,数据库版本是8.0.