3

两种情况:

使用默认排序规则:

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)
4

2 回答 2

4

排序规则确定了为索引考虑列的方式以及进行比较的方式。utf8 bin 用于按二进制值比较字符串,而 utf8 general 用于按字母值进行比较。被视为匹配的内容会因排序规则而异,并且顺序也会因排序规则而异。如果该列被视为二进制(如在 UTF8 bin 中),则当且仅当其位值相等时,一个字符才等于另一个字符。

当您在 select 语句中指定与字段的默认排序规则不同的排序规则时,您无法利用现有索引(使用默认排序规则)。如果您在使用索引列的查询上手动指定排序规则,它应该与在非索引列上的排序规则大致相同(假设手动指定的排序规则与列的默认排序规则不同),因为它只会忽略索引,在这种情况下,MySQL 将使用 QuickSort(使用基于指定排序规则的比较器)。

于 2012-09-06T16:53:45.993 回答
0

如果您在该列上没有索引,我认为它不会变慢。使用索引列会更慢。

对于第一个表,我得到 Extra field =“Using index;”,第二个表“Using index; Using filesort”。所以第二个会慢一些。

于 2012-09-06T15:38:31.053 回答