gpt4 book ai didi

mysql - 在 SQL 语句中对 utf8_bin 中的字段进行 COLLATE 比使用默认排序规则慢?

转载 作者:可可西里 更新时间:2023-11-01 08:06:46 28 4
gpt4 key购买 nike

两种情况:

使用默认排序规则:

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 - 在 SQL 语句中对 utf8_bin 中的字段进行 COLLATE 比使用默认排序规则慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12303433/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com