暂无图片
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


请输入正文
提交
相关推荐
mysql支持修改分区表的分区列的类型或者长度吗?
回答 2
可以修改的,但是在表中有数据的情况下,修改列的数据类型会容易造成数据混乱,数据长度在允许的范围内是可以修改的mysql>showcreatetableemployees\G1.rowTable:
远程协助搭建mysql集群
回答 4
问题解决没,可远程指导
为什么要在 MYSQL 中设置备份与恢复功能?
回答 1
已采纳
定期进行数据库备份,一旦发生数据损失,就可以通过备份的数据文件,及时在数据库发生故障后还原和恢复数据。造成数据损失的原因有很多,主要有以下四方面:1)存储介质损坏:人为或自然灾害导致保存数据库文件的磁
关于TDsql数据库的问题
回答 1
是否能满足3年内历史页面快速查询。分区表是将数据分散到不同的物理存储中,查询时只需要查找与查询条件匹配的分区,从而减少查询的数据量,提高查询速度。因此,按月分区表可以满足3年内的历史页面快速查询的需求
mysql 有没有类似oracle 的dblink的 可以连接远程数据库的方式?
回答 1
已采纳
有的,需要确认MySQL是否安装了federated引擎:输入命令:showengines;  (YES表示启用)MYSQL链接远程的链接表创建:远程表:CREATETABLEIF
mysql最高每秒能插入多少条数据 ?
回答 1
已采纳
默认情况下10005000都有可能。
mysql中where条件语句加入子查询就挂机了,语句一定没有错,在sqlserver中运行正常
回答 1
sqlserver与mysql 处理子查询的算法是完全不一样的。你可以把explain发出来看看。在mysql8.0以前版本, 子查询很容易走DEPENDENTSUBQUERY&n
Mysql8 哪个小版本相对稳定
回答 6
可以试试8.4.x版本,以后长期维护版本
zabbix+grafana监控mysql数据库top sql
回答 3
白求恩支持的。
在一个高并发的MySQL数据库环境中,哪一个设置能够帮助减少不必要的行级锁冲突,同时保持良好的数据一致性和事务隔离?
回答 1
已采纳
B)设置innodbautoinclockmode2(即:INTERLEAVED模式)