色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

Mysql使用函數索引會生效嘛

錢琪琛2年前7瀏覽0評論

在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中,并在該字段上創建了索引。現在我們就可以使用等值查詢,并命中索引了。

總結一下,使用函數索引不會生效。如果真的有這樣的需求,只能通過倒推的方式來解決。