两种情况:
使用默认排序规则:
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)
答案 0 :(得分:4)
排序规则决定了列的索引方式以及进行比较的方式。 utf8 bin用于按二进制值比较字符串,utf8 general用于按字母值进行比较。什么被认为是匹配将根据整理而变化,并且顺序将根据整理而变化。如果将列视为二进制(如在UTF8 bin中),则当且仅当其位值相等时,字符等于另一个字符。
如果在字段的默认排序规则中在select语句中指定其他排序规则,则无法利用现有索引(使用默认排序规则)。如果您使用索引列在查询上手动指定排序规则,它应该大致相同,因为它将在非索引列上(假设手动指定的排序规则与列的默认排序规则不同),因为它只是忽略索引,在这种情况下,MySQL将使用QuickSort(使用基于指定排序规则的比较器)。
答案 1 :(得分:0)
如果您没有该列的索引,我认为它不会慢。使用索引列会更慢。
使用第一个表我得到Extra field =“Using index;”,第二个表是“Using index; Using filesort”。所以第二个会慢一些。