【发布时间】:2014-10-20 22:16:37
【问题描述】:
我正在尝试优化我的 MySQL 数据库,以便尽快查询它。
是这样的:
我的数据库由 1 个表组成,该表(目前)大约有 1800 万行 - 并且增长迅速。 此表具有以下列 - idx、时间、tag_id、x、y、z。 没有任何列有任何空值。
'idx' 是一个 INT(11) 索引列,AI 和 PK。现在是升序排列。
'time' 是一个日期时间列。它也在上升。表中 50% 的“时间”值是不同的(其余的值可能最多出现两次或 3 次)。
'tag_id' 是一个 INT(11) 列。它没有以任何方式排序,并且有 30-100 个不同的可能 tag_id 值分布在整个数据库中。它也是另一个表的外键。
插入 - 每隔 2-3 秒就会向表中插入一个新行。 'idx' 由服务器 (AI) 计算。由于“时间”列表示插入行的时间,因此插入的每个新“时间”都将高于或等于前一行。所有其他列值没有任何顺序。
选择 - 这是一个典型查询的示例: "select x, y, z, time from table where date(time) between '2014-08-01' and '2014-10-01' and tag_id = 123456"
因此,'time' 和 'tag_id' 是唯一出现在 where 部分的列,并且它们都将始终出现在每个查询的 where 部分中。 'x'、'y' 和 'z' 和 'time' 将始终出现在选择部分中。 'tag_id' 有时也可能出现在选择部分中。
查询通常会寻找更高(最近)的时间,而不是更早的时间。含义 - 表中后面的行将被更多地搜索。
索引- 现在,作为 PK 的 'idx' 是聚集的 ASC 索引。 'time' 也有一个非聚集的 ASC 索引。
就是这样。考虑到所有这些数据,一个典型的查询将在大约 30 秒内为我返回结果。这次我试图降低。有什么建议吗??
我正在考虑将一个或两个索引从 ASC 更改为 DESC(因为较高的值在搜索中更受欢迎)。如果我将 'idx' 更改为 DESC,它将在物理上反转整个表。如果我将“时间”更改为 DESC,它将反转“时间”索引树。但由于这是一个 1800 万行的表,这样的更改对于服务器来说可能需要很长时间,所以我想确定这是一个好主意。问题是,如果我颠倒顺序并插入新行,服务器会知道快速将其放在表的开头吗?还是会每次都在桌子上搜索这个地方?在表的开头放置一个新行是否意味着每次都需要对整个表进行某种数据转移?
或者也许我只是需要一种不同的索引技术? 非常欢迎您提出任何想法.. 谢谢!!
【问题讨论】:
标签: mysql indexing query-optimization