mysql-utf8_bin中字段上的SQL语句中的COLLATE比使用默认排序规则慢?
作者:互联网
两种情况:
使用默认排序规则:
CREATE TABLE IF NOT EXISTS `table` (
`name` varchar(255) collate utf8_general_ci NOT NULL,
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SELECT `name` FROM `table` ORDER BY `name`;
使用COLLATE:
CREATE TABLE IF NOT EXISTS `table` (
`name` varchar(255) collate utf8_bin NOT NULL,
UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SELECT `name` FROM `table` ORDER BY `name` COLLATE utf8_general_ci;
我需要从第一种情况更改为第二种情况,因为索引不区分大小写.仍然订购很重要. utf8_general_cs属于实验性归类,但需要特殊编译.
这会对性能产生影响吗?
在我看来,如果MySQL在utf8中内部存储文本字段而与归类无关,则它不会影响性能.
编辑:
如果使用COLLATE,则说明的输出与不使用时的说明相同.
mysql> EXPLAIN SELECT *
-> FROM `table`
-> ORDER BY `name`
-> COLLATE utf8_general_ci;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL | 5 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT *
-> FROM `table`
-> ORDER BY `name`;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL | 5 | Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)
解决方法:
排序规则确定将列视为索引的方式以及进行比较的方式. utf8 bin用于按二进制值比较字符串,而utf8 general用于按字母值比较.认为匹配的规则会因排序规则而有所不同,而顺序也会因排序规则而有所不同.如果将该列视为二进制(如UTF8 bin中一样),则当且仅当其位值相等时,该字符才等于另一个字符.
当您在select语句中指定的排序规则与字段的默认排序规则不同时,您将无法利用现有索引(使用默认排序规则).如果您在使用索引列的查询上手动指定排序规则,就像在非索引列上进行手动排序(如果手动指定的排序规则与该列的默认排序规则不同)一样,则应该大致相同,因为它只会忽略索引,在这种情况下,MySQL将使用QuickSort(使用基于指定排序规则的比较器).
标签:utf-8,collation,mysql 来源: https://codeday.me/bug/20191031/1979417.html