mysql use filesort_mysql explain中的using filesort

mysql explain中的using filesort

Using filesort表示在索引之外,需要额外进行外部的排序动作。导致该问题的原因一般和order by有者直接关系,一般可以通过合适的索引来减少或者避免。

explain SELECT * from table_item WHERE user_id = 2 ORDER BY item_id LIMIT 0, 5

user_id 和 item_id 分别建立一个索引,对此语句MySQL选择了 user_id索引,那么 item_id 的索引没有起到任何用处。当排序时记录数较多,内存中的排序 buffer满了,只能 Using filesort 进行外部排序。

解决方式为对这两列建立组合索引。

explain SELECT * from table_item WHERE user_id = 2 and user_age > 20 ORDER BY item_id LIMIT 0, 5

建立组合索引(user_id, user_age, item_id),看似非常完美。但由于user_age规则不是确定值,使用该组合索引的话实际上需要先按索引找出一个个user_age下的东西后再对其进行排序,仍然会filesort。

解决方式是使用组合索引(user_id, item_id),对排序好的item_id再过滤到不满足user_age > 20的条目,不会出现filesort。

explain SELECT * from table_item WHERE user_id = 2 ORDER BY item_attr desc, item_id LIMIT 0, 5

建立了组合索引(user_id, item_attr, item_id),因为item_attr是降序而item_id是升序,从而仍然需要外部排序。

如果item_attr和item_id都是升序或者都是降序,则不会出现filesort;建立组合索引(user_id, item_attr desc, item_id)现象依旧。

Mysql5.1在线文档“13.1.4. CREATE INDEX语法”中提到:“一个index_col_name规约可以以ASC或DESC为结尾。这些关键词将来可以扩展,用于指定递增或递减索引值存储。目前,这些关键词被分析,但是被忽略;索引值均以递增顺序存储。”

可以看出无法通过修改索引来避免这个filesort,只能是如果可能的话修改查询的排序条件。

相关文档:

1.myisam表不支持外键,innodb才支持外键

2.mysql外键的列类型和主表中相应的主键列类型必须一致,即类型一致、长度一致,否则会报错。ERROR 1005: Can't create table (errno: 150)

3.在一个数据库中外键名字不能重复,否则会报ERROR 1005: Can't create table 'XXXXXX' (errno: 121) ......

Mysql 存储例程的使用

一、      简介

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程  是数据库中的一个重要对象,任何一个设计良好的 ......

使用mysql中的with rollup可以得到每个分组的汇总级别的数据:

表如下:

CREATE TABLE `test3` (

`id` int(5) unsigned NOT NULL AUTO_INCREMENT,

`name1` varchar(10) DEFAULT NULL,

`name2` varchar(10) DEFAULT NULL,

`cnt` int(2) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGI ......

使用ant工具编译程序,运行程序.命令:ant -f xxx.xml指定生成文件;ant run编译并运行文件。

如果Hibernate将中文插入mysql数据库,调用select语句中文显示乱码,则mysql的编码方式设为gbk,注意这里是小写,不用重新安装mysql数据库,将MySQL Server 5.1目录下的my.ini配置文件里的所有default-character-set设为gbk,� ......

从A主机导入数据到B主机

mysqldump -hA -uusername -ppassword db_name >dumpfile

mysql -hB -uusername -ppassword

mysql>create database db_name2;

mysql>use db_name2;

mysql>source dumpfile;

先用dump把A中的数据库db_name导入到文件dumpfile,然后在B主机上,创建一个新的数据库db_name2,使用 ......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQLfilesort 是一个操作,它在查询用于处理 ORDER BY 子句或者 GROUP BY 子句。 当MySQL需要按特定字段进行排序或者分组时,它必须按照指定的条件来检索数据,并在内存或磁盘上对结果进行排序。这个过程称为filesort。 在进行filesort时,MySQL会将要排序的数据从磁盘加载到内存去,并使用一种类似快速排序算法的技术对数据进行排序。如果数据量太大无法完全加载到内存MySQL可能会使用临时文件进行排序。 filesort的性能取决于多种因素,包括数据量、可用内存和硬盘性能。如果数据量较小且内存足够,排序操作可以在内存完成,反之则需要使用临时文件进行辅助排序。 为了优化filesort操作,可以考虑以下几点: 1. 确保查询的 ORDER BY 或 GROUP BY 子句的字段有适当的索引。索引可以帮助MySQL更快地找到和排序数据。 2. 提高系统的可用内存大小,这样更多的数据可以在内存进行排序,减少磁盘I/O操作。 3. 根据业务需求,避免不必要的排序操作,比如可以在应用程序进行排序,而不是完全依赖于数据库。 4. 如果filesort仍然是性能瓶颈,可以考虑分区或者分片等技术来减少排序的数据量。 总之,MySQLfilesort操作是为了处理排序和分组的需求,通过将数据加载到内存并排序,以获取更高的查询效率。针对filesort的优化可以提高查询性能,使得排序操作更快、更高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值