在Mysql中,使用函數索引是一個十分常見的操作。然而,很多人不知道使用函數索引是否會生效。下面就讓我們來探討一下這個問題。
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `idx_age` (`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; EXPLAIN SELECT * FROM user WHERE age + 1 = 20;
在上面的代碼中,我們創建了一張user表,并在age字段上創建了索引。然后我們執行了一條SQL語句,在查詢時對age字段進行了加一操作。
那么,使用了函數索引的查詢,會不會命中索引呢?
答案是不會。因為Mysql索引的本質是一個B+樹,而B+樹只支持類似于等值、范圍的操作,而不支持任何函數操作。
那么如果我們真的有這樣的需求,要怎樣解決呢?
解決方法就是:倒推。我們將要查詢的值先進行加減操作,然后將結果存入一個新的字段中,再創建索引。這樣,在查詢時就可以直接使用等值查詢,從而命中索引,提高查詢效率。
ALTER TABLE user ADD COLUMN age_processed INT(11) NOT NULL DEFAULT '0' AFTER age; UPDATE user SET age_processed = age + 1; CREATE INDEX idx_age_processed ON user(age_processed); EXPLAIN SELECT * FROM user WHERE age_processed = 20;
在上面的代碼中,我們將age字段進行了加一操作,然后將結果存入了新的字段age_processed中,并在該字段上創建了索引。現在我們就可以使用等值查詢,并命中索引了。
總結一下,使用函數索引不會生效。如果真的有這樣的需求,只能通過倒推的方式來解決。