gpt4 book ai didi

MYSQL order by 坚持使用filesort

转载 作者:行者123 更新时间:2023-11-29 06:22:26 25 4
gpt4 key购买 nike

我需要优化执行排序依据的 MYSQL 查询。无论我做什么,mysql 最终都会执行文件排序而不是使用索引。

这是我的表 ddl...(是的,在这种情况下,DAYSTAMP 和 TIMESTAMP 列完全相同)。

CREATE TABLE DB_PROBE.TBL_PROBE_DAILY ( 
DAYSTAMP date NOT NULL,
TIMESTAMP date NOT NULL,
SOURCE_ADDR varchar(64) NOT NULL,
SOURCE_PORT int(10) NOT NULL,
DEST_ADDR varchar(64) NOT NULL,
DEST_PORT int(10) NOT NULL,
PACKET_COUNT int(20) NOT NULL,
BYTES int(20) NOT NULL,
UNIQUE KEY IDX_TBL_PROBE_DAILY_05 (DAYSTAMP,SOURCE_ADDR(16),SOURCE_PORT,
DEST_ADDR(16),DEST_PORT,TIMESTAMP),
KEY IDX_TBL_PROBE_DAILY_01 (SOURCE_ADDR(16),TIMESTAMP),
KEY IDX_TBL_PROBE_DAILY_02 (DEST_ADDR(16),TIMESTAMP),
KEY IDX_TBL_PROBE_DAILY_03 (SOURCE_PORT,TIMESTAMP),
KEY IDX_TBL_PROBE_DAILY_04 (DEST_PORT,TIMESTAMP),
KEY IDX_TBL_PROBE_DAILY_06 (DAYSTAMP,TIMESTAMP,BYTES)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

/*!50100 PARTITION BY RANGE (to_days(DAYSTAMP))

(PARTITION TBL_PROBE_DAILY_P20100303 VALUES LESS THAN (734200) ENGINE = InnoDB,
PARTITION TBL_PROBE_DAILY_P20100304 VALUES LESS THAN (734201) ENGINE = InnoDB,
PARTITION TBL_PROBE_DAILY_P20100305 VALUES LESS THAN (734202) ENGINE = InnoDB,
PARTITION TBL_PROBE_DAILY_P20100306 VALUES LESS THAN (734203) ENGINE = InnoDB) */;

分区是每日的,我添加了 IDX_TBL_PROBE_DAILY_06 特别是对于我正在尝试执行的查询,即:

select SOURCE_ADDR as 'Source_IP',    
SOURCE_PORT as 'Source_Port',
DEST_ADDR as 'Destination_IP',
DEST_PORT as 'Destination_Port',
BYTES
from TBL_PROBE_DAILY
where DAYSTAMP >= '2010-03-04' and DAYSTAMP <= '2010-03-04'
and TIMESTAMP >= FROM_UNIXTIME(1267653600) and TIMESTAMP <= FROM_UNIXTIME(1267687228)
order by bytes desc limit 20;

具体方案说明如下:

+----+-------------+-----------------+---------------------------+-------+-----------------------------------------------+------------------------+---------+------+--------+-----------------------------+ | id | select_type | table |
partitions | type | possible_keys |
key | key_len | ref | rows | Extra |
+----+-------------+-----------------+---------------------------+-------+-----------------------------------------------+------------------------+---------+------+--------+-----------------------------+ | 1 | SIMPLE | TBL_PROBE_DAILY |
TBL_PROBE_DAILY_P20100304 | range |
IDX_TBL_PROBE_DAILY_05,IDX_TBL_PROBE_DAILY_06 | IDX_TBL_PROBE_DAILY_05 | 3 | NULL |
216920 | Using where; Using filesort |
+----+-------------+-----------------+---------------------------+-------+-----------------------------------------------+------------------------+---------+------+--------+-----------------------------+

我还尝试过 FORCE INDEX (IDX_TBL_PROBE_DAILY_06) ,在这种情况下,它很乐意使用 IDX_06 来满足 where 约束,但仍然进行文件排序:(

我无法想象分区表上不可能进行索引排序? InnoDB 在这方面与 MyISAM 的行为不同?我本来认为 InnoDBs 索引+数据缓存是索引排序的理想选择。

任何帮助将不胜感激...我整个星期都在尝试以不同的方式优化这个查询,但没有取得太大成功。

最佳答案

好的。看起来交换索引中的列就可以了。
我真的不知道为什么......也许其他人有解释?

无论哪种方式,如果我添加索引

create index IDX_TBL_PROBE_DAILY_07 on TBL_PROBE_DAILY(BYTES,DAYSTAMP)   

然后mysql倾向于IDX07(即使没有强制索引)并进行索引排序而不是文件排序。

关于MYSQL order by 坚持使用filesort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2385668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com