2016-09-28 121 views
0

我有一個大型的大型數據庫,大約10GB。在一個數據庫中的表被稱爲在大行內搜索大型Mysql數據庫中的確切日期ID

clients 

在該表中有一個名爲

case 

創建此客戶端混入該列中的數字的日期科拉姆。

這裏是一個入門的case

011706-0001 

一個例子,06部是指該客戶於2006年創建的,我需要拉動在2015年創建至2016年所以我需要的所有客戶端查詢case在短劃線之前有15或16的任何東西。

例如,000015-0000000016-0000

有沒有辦法,只有MySQL來做到這一點?我的思維過程是,我將不得不查詢整個列然後使用php到preg_match()

我擔心根據數據庫的大小這會導致問題。

回答

4

要找到具有包含'06-'(字符0和6,接着由短劃線一個case列值的行...

一種選擇是使用LIKE比較運算符:

SELECT ... 
    FROM clients t 
    WHERE t.case LIKE '%06-%' 
    ORDER BY ... 

百分號符號是LIKE比較中的通配符,匹配任意數量的字符(零個,一個或多個)。

MySQL需要評估的條件,每排在表中。 MySQL無法利用索引範圍掃描操作。

SELECT ... 
    FROM clients t 
    WHERE t.case LIKE '%15-%' 
    OR t.case LIKE '%16-%' 
    ORDER BY ... 

這將評估爲true,其中包括三個字符'15-''16-'序列的任何值。

如果case列中的值有更多標準格式,其值始終以6個字符表示日期'mmddyy-nnnnn',並且您只想匹配第5到第7個字符,則可以使用下劃線通配符匹配例如任意一個字符(在LIKE比較)...使用四個下劃線

t.case LIKE '____16-%' 

或者你可以使用一個SUBSTR功能三個大字從case值提取,並進行相等比較...

SUBSTR(t.case,5,3) = '15-' 

    SUBSTR(t.case,5,3) IN ('15-','16-') 

也可以使用REGEXP比較代替LIKE比較。


在性能方面,上述所有方法都將需要通過每一行表中的曲柄,評價比較條件。

如果該日期值作爲一個單獨的列存儲爲DATE數據類型,並且存在一個以該列作爲主要列的索引,那麼MySQL可以有效地使用範圍掃描操作。 ..

WHERE t.casedate >= '2015-01-01' 
    AND t.casedate < '2017-01-01'