如果可能的話,應避免使用UPPER
作爲解決該問題,因爲它會帶來在轉換的值的兩個開銷每行都是大寫,MySQL的開銷無法使用該列上的任何索引。
如果你的數據並不需要存儲在區分大小寫的列,那麼你應該選擇的表或列適當的歸類。查看我對how i can ignore the difference upper and lower case in search with mysql的回答,查看排序如何影響大小寫敏感性的示例。
下面顯示了兩個查詢的結果EXPLAIN SELECT
。一個使用UPPER
,一個不:
DROP TABLE IF EXISTS `table_a`;
CREATE TABLE `table_a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` varchar(255) DEFAULT NULL,
INDEX `value` (`value`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO table_a (value) VALUES
('AAA'), ('BBB'), ('CCC'), ('DDD'),
('aaa'), ('bbb'), ('ccc'), ('ddd');
EXPLAIN SELECT id, value FROM table_a WHERE UPPER(value) = 'AAA';
+----+-------------+---------+-------+---------------+-------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+-------+---------+------+------+--------------------------+
| 1 | SIMPLE | table_a | index | NULL | value | 258 | NULL | 8 | Using where; Using index |
+----+-------------+---------+-------+---------------+-------+---------+------+------+--------------------------+
EXPLAIN SELECT id, value FROM table_a WHERE value = 'AAA';
+----+-------------+---------+------+---------------+-------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+-------+---------+-------+------+--------------------------+
| 1 | SIMPLE | table_a | ref | value | value | 258 | const | 2 | Using where; Using index |
+----+-------------+---------+------+---------------+-------+---------+-------+------+--------------------------+
注意,它使用UPPER
必須掃描所有的行,而第二隻需要第一SELECT
來掃描兩個 - 匹配兩個。在這種大小的表格上,差異顯然難以察覺,但對於大型表格,全表掃描會嚴重影響查詢速度。
well..Thanks傢伙。你們所有人都提供了正確的答案。因爲他是第一個答覆,因此對所有人和所有接受的答案+1。謝謝! – FlyingCat 2010-07-08 14:05:55