mysql使用crc32欄位建索引提高查詢效率

來源:互聯網
上載者:User

之前也寫過這樣的一篇文章,再來一篇。

給字串類型的欄位建立索引效率不高,但是必須要經常查這個欄位怎麼建索引?比如這個欄位名稱是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.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.