基于INT列的最后一位数字的MySQL索引
是否可以在MySQL中为int列的最后一位数字创建索引?基于INT列的最后一位数字的MySQL索引
基于int列
CREATE TABLE partition_test( textfiled INT,
cltext TEXT,
reindexedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
indexedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
status TINYINT(2),
postId INT)
PARTITION BY HASH(MOD(postId, 10))
PARTITIONS 10;
我试图创建的帖子ID为优化查询时间的最后一个数字的指数的最后一位在此基础上answer我已经创建的分区。有没有办法做到这一点或在postId上的简单索引就足够了?
一些失败的尝试:
CREATE INDEX postLastDigit USING HASH ON partition_test (MOD(postId, 10)); (1064, u"You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'MOD(postId, 10))' at line 1")
和
CREATE INDEX postLastDigit ON partition_test (MOD(postId, 10)); (1064, u"You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'MOD(postId, 10))' at line 1")
UPDATE: 表有100M以上的行。
我的目标是优化之类的查询:
1)
SELECT cltext FROM partition_tables WHERE postId in (<INT>, <INT>)
AND status IS NOT NULL
2)
SELECT cltext FROM partition_tables WHERE postId in (<INT>, <INT>)
AND status IS NOT NULL
AND reindexedAt BETWEEN (<DATE>, <DATE>)
MariaDB的版本:23年1月10日 - MariaDB的-9 + deb9u1
回答:
您已经标记为mariadb
和mysql
。如果您使用的是最近版本的MariaDB,则可以使用生成的列进行索引编制。如果你使用的是MySQL,如果你的MySQL版本至少为5.7,你也可以这样做。
如果您使用的是较低版本的MySQL,则可以在表格中创建一个附加列,其中每行存储postId
的最后一位数字,并将该列用于索引/分区。
这将意味着对应用程序代码的最小更改:插入或更新之前,首先获取postId
的最后一位数字,然后再插入/更新一个字段。或者,您最终可以使用触发器自动填充该附加列。
回答:
使用虚拟列。在MariaDB的10.2,您可以virtual aka generated column创建索引,这样
CREATE TABLE t ( num int,
last_digit int(1) AS (num % 10) VIRTUAL,
KEY index_last_digit (last_digit)
)
然后你就可以在你的查询中使用last_digit,即SELECT ... WHERE last_digit = 1
在旧版本MariaDB的,5.2的对10.1,您需要指定PERSISTENT属性而不是VIRTUAL,因为非持久生成的列无法编制索引。
回答:
你想加快什么查询?没有任何索引的表,任何查询将不得不扫描整个表!如果你想要速度,首先看看索引。
如果您的查询是SELECT ... WHERE post_id = 123
,您的分区可能会使其运行速度提高约10倍。但是,带有或不带分区的INDEX(post_id)
将使其运行速度提高数百倍。
请提供SELECTs
,这样我们可以帮助您加快速度。
(OK,如果你只是用分区玩耍,别人给你的答案可行)。
“分区修剪”很少比用修剪列开始一个合适的索引更快。
解决了哈希问题后,请报告查询是否比使用索引更快。即使与指数对比,我预测分区不会跑得更快,甚至可能会慢一点。
以上是 基于INT列的最后一位数字的MySQL索引 的全部内容, 来源链接: utcz.com/qa/263276.html