gpt4 book ai didi

mysql - 使用 filesort 按 MySQL 中的日期时间列排序

转载 作者:行者123 更新时间:2023-11-29 07:15:33 24 4
gpt4 key购买 nike

我有一张带有日期时间 (DATE) 和位 (PUBLIC) 的 Cars 表。

现在我想获取按 DATE 和 PUBLIC = 1 排序的行,所以我使用:

select
c.*
from
Cars c
WHERE
c.PUBLIC = 1
ORDER BY
DATE DESC

但不幸的是,当我使用 explain 查看发生了什么时,我得到了这个:

1   SIMPLE  a   ALL     IDX_PUBLIC,DATE     NULL    NULL    NULL    103     Using where; Using filesort

当我只有 100 行时,获取这些数据需要 0.3 毫秒。还有其他方法可以禁用文件排序吗?

如果我转到索引,我在 (PUBLIC, DATE) 上的索引不是唯一的。

表定义:

CREATE TABLE IF NOT EXISTS `Cars` (
`ID` int(11) NOT NULL auto_increment,
`DATE` datetime NOT NULL,
`PUBLIC` binary(1) NOT NULL default '0'
PRIMARY KEY (`ID`),
KEY `IDX_PUBLIC` (`PUBLIC`),
KEY `DATE` (`PUBLIC`,`DATE`)
) ENGINE=MyISAM AUTO_INCREMENT=186 ;

最佳答案

您需要在 (public, date) 上有一个复合索引

这样,MySQL 将根据public 进行过滤并根据date 进行排序。

从你的 EXPLAIN 我看到你在 (public, date) 上没有复合索引。

相反,您在 publicdate 上有两个不同的索引。至少,这就是它们的名称 IDX_PUBLICDATE 告诉我们的。

更新:

您的public 列不是BIT,而是BINARY(1)。它是一种字符类型,使用字符比较。

当比较整数和字符时,MySQL 将后者转换为前者,而不是相反。

这些查询返回不同的结果:

CREATE TABLE t_binary (val BINARY(2) NOT NULL);

INSERT
INTO t_binary
VALUES
(1),
(2),
(3),
(10);

SELECT *
FROM t_binary
WHERE val <= 10;

---
1
2
3
10

SELECT *
FROM t_binary
WHERE val <= '10';
---
1
10

将您的 public 列更改为 bit 或将您的查询重写为:

SELECT  c.*
FROM Cars c
WHERE c.PUBLIC = '1'
ORDER BY
DATE DESC

,我。 e.比较字符与字符,而不是整数。

关于mysql - 使用 filesort 按 MySQL 中的日期时间列排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1471243/

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