在使用utf8_bin中的字段的SQL语句中收集比使用默认排序规则慢吗?

时间:2012-09-06 15:27:04

标签: mysql utf-8 collation

两种情况:

使用默认排序规则:

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)

2 个答案:

答案 0 :(得分:4)

排序规则决定了列的索引方式以及进行比较的方式。 utf8 bin用于按二进制值比较字符串,utf8 general用于按字母值进行比较。什么被认为是匹配将根据整理而变化,并且顺序将根据整理而变化。如果将列视为二进制(如在UTF8 bin中),则当且仅当其位值相等时,字符等于另一个字符。

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

答案 1 :(得分:0)

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

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