Если возможно, вам следует избегать использования UPPER
в качестве решения этой проблемы, так как это связано как с издержками преобразования значения в каждой строке в верхний регистр, так и с накладными расходами MySQL, которые не могут использовать любой индекс,находиться в этом столбце.
Если ваши данные не нужно хранить в чувствительных к регистру столбцах, вам следует выбрать соответствующий параметр сортировки для таблицы или столбца.См. Мой ответ на , как я могу игнорировать верхний и нижний регистр различий при поиске с помощью mysql , чтобы узнать, как сопоставление влияет на чувствительность к регистру.запросы.Один использует 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 |
+----+-------------+---------+------+---------------+-------+---------+-------+------+--------------------------+
Обратите внимание, что первый SELECT
, использующий UPPER
, должен сканировать все строки, тогда как второй должен сканировать только две - двеэтот матчВ таблице такого размера разница явно неощутима, но при большой таблице полное сканирование таблицы может серьезно повлиять на скорость вашего запроса.