2017-10-12 148 views
0

是否可以在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

+0

這是一個壞主意。此外,基本上*隨機*分區不會改善任何事情。它肯定會損害性能,因爲服務器將被迫搜索所有分區。 –

回答

1

您已經標記爲mariadbmysql。如果您使用的是最近版本的MariaDB,則可以使用生成的列進行索引編制。如果你使用的是MySQL,如果你的MySQL版本至少爲5.7,你也可以這樣做。

如果您使用的是較低版本的MySQL,則可以在表格中創建一個附加列,其中每行存儲postId的最後一位數字,並將該列用於索引/分區。

這將意味着對應用程序代碼的最小更改:插入或更新之前,首先獲取postId的最後一位數字,然後再插入/更新一個字段。或者,您最終可以使用觸發器自動填充該附加列。

+0

從一開始我試圖避免這種選擇。我會等待其他可能的答案,否則我會接受你的。 tnx Binarus –

+1

謝謝!我過去也是這樣做的...... – Binarus

+2

@SimakisPanagiotis:你可以創建一個生成的列([Generated(Virtual and Persistent)Columns](https://mariadb.com/kb/en/library/generated-columns /))並索引它。 – wchiquito

0

使用虛擬列。在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,因爲非持久生成的列無法編制索引。

1

你想加快什麼查詢?沒有任何索引的表,任何查詢將不得不掃描整個表!如果你想要速度,首先看看索引。

如果您的查詢是SELECT ... WHERE post_id = 123,您的分區可能會使其運行速度提高約10倍。但是,帶有或不帶分區的INDEX(post_id)將使其運行速度提高數百倍。

請提供SELECTs,這樣我們可以幫助您加快速度。

(OK,如果你只是用分區玩耍,別人給你的答案可行)。

「分區修剪」很少比用修剪列開始一個合適的索引更快。

解決了哈希問題後,請報告查詢是否比使用索引更快。即使與指數對比,我預測分區不會跑得更快,甚至可能會慢一點。

+0

像這樣的隨機分區可能會使查詢運行速度慢10倍,而不是更快。 –

相關問題