gpt4 book ai didi

mysql - 更改 MySQL 磁盘上的数据组织

转载 作者:行者123 更新时间:2023-11-30 01:38:10 25 4
gpt4 key购买 nike

我们在 MySQL 数据库中有一个相当静态的数据集,但读取时间很糟糕(即使在被查询的列上有索引)。理论上,由于行是随机存储的(或者有时按插入顺序存储),因此磁盘头必须四处扫描以查找不同的行,即使它由于索引而知道它们在哪里,而不是仅仅顺序读取它们。

是否可以更改数据在磁盘上的存储顺序,以便可以按顺序读取数据?不幸的是,我们目前无法添加大量 RAM 来缓存所有查询。如果可以更改订单,我们可以在订单中定义订单吗?例如,按某一列排序,如果第一列相等,则按另一列排序。

这可能与指数有关吗?

其他详细信息:非关系型单表数据库,包含 1600 万行、总数据量 1 GB、512 MB RAM、Ubuntu 12.04 上的 MariaDB 5.5.30,带标准硬盘。这也是一个使用 OpenVZ 的虚拟机,2 个专用核心 E5-2620 2Ghz CPU

创建语法:

CREATE TABLE `Events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`provider` varchar(10) DEFAULT NULL,
`location` varchar(5) DEFAULT NULL,
`start_time` datetime DEFAULT NULL,
`end_time` datetime DEFAULT NULL,
`cost` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `provider` (`provider`),
KEY `location` (`location`),
KEY `start_time` (`start_time`),
KEY `end_time` (`end_time`),
KEY `cost` (`cost`)
) ENGINE=InnoDB AUTO_INCREMENT=16321002 DEFAULT CHARSET=utf8;

选择耗时较长的语句:

SELECT *
FROM `Events`
WHERE `Events`.start_time >= '2013-05-03 23:00:00' AND `Events`.start_time <= '2013-06-04 22:00:00' AND `FlightRoutes`.location = 'Chicago'

解释选择:

1   SIMPLE  Events  ref location,start_time location    18  const   3684    Using index condition; Using where

最佳答案

MySQL 只能选择一个 索引进行过滤(这是有道理的,因为使用索引限制结果后,它无法确定这种限制如何影响其他索引)。因此,它跟踪每个索引的基数并选择可能最具选择性的索引(即具有最高基数):在本例中,它选择了 location 索引,但这将通常会留下 3,684 条记录,必须提取这些记录,然后使用 where 进行过滤以查找与所需的 start_time 范围 匹配的记录。

您应该尝试创建 composite index经过(位置,开始时间):

ALTER TABLE Events ADD INDEX (location, start_time)

关于mysql - 更改 MySQL 磁盘上的数据组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16557074/

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