之前也寫過這樣的一篇文章,再來一篇。
給字符串類型的字段建立索引效率不高,但是必須要經常查這個字段怎麼建索引?比如這個字段名稱是sys_trans_id字符串類型,那麼可以建一個字段sys_trans_id_src32來存儲crc32的值,並給這個字段建立索引。
crc32是整形,在MySQL中,給整形字段建立索引效率比較高,crc32雖然不能確保唯一性,但是無礙,相同的機率也是極小,關鍵是可以大大減少查詢的范圍,給sys_trans_id_src32這個字段建立索引,查詢的時候帶上crc32字段就可以利用到索引。
SQL如下,比如要查詢sys_trans_id,同時帶上sys_trans_id_src32走索引:
EXPLAIN SELECT
*
FROM
`js_checking_third_detail`
WHERE
(`biz_date` = '20160104')
AND (`diff_type` IN('2', '3'))
AND (
`sys_trans_id_src32` = '509417929'
)
AND (
`sys_trans_id` = '11451875264169885'
)
AND (`trans_type` = '1')
AND (`pay_type` = '1')
AND (`account_id` = '1')
ORDER BY
diff_type DESC,
biz_date DESC,
id DESC
LIMIT 0,
50
這樣就通過crc32字段利用到了索引,看看索引的使用情況:
假設不帶上這個crc32的查詢:
效率上的差別還是挺大的,數據越多越明顯。
使用PHP的crc32函數可能會出現負值的情況,修正方法如下:
/**
* @desc CRC32的修正方法,修正php x86模式下出現的負值情況
* @param $str
* @return string
*/
function jp_crc32($str){
return sprintf("%u",crc32($str));
}
存儲數據的時候順便也計算一下crc32的值存進去即可,查詢的時候同樣先算出要查詢字段的crc32.