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(使用基于指定排序规则的比较器).

上一篇:mysql-Varchar为UTF-8吗?


下一篇:MySQL 8.0新特性详解(转)