3

2つのシナリオ:

デフォルトの照合を使用する:

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;

インデックスでは大文字と小文字が区別されないため、最初のシナリオから2番目のシナリオに変更する必要があります。それでも注文は重要です。実験的な照合もありますがutf8_general_cs、特別なコンパイルが必要です。

これはパフォーマンスに影響しますか?

私の意見MySQLでは、照合とは関係なくutf8の内部にテキストフィールドを格納する場合、パフォーマンスに影響を与えることはありません。

編集:使用されている 場合のexplainの出力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は、文字列を2進値で比較するためのものであり、utf8 generalは、アルファベット値で比較するためのものです。一致と見なされるものは照合によって異なり、順序は照合によって異なります。列がバイナリとして扱われる場合(UTF8 binのように)、ビット値が同等である場合に限り、文字は別の文字と等しくなります。

selectステートメントでフィールドのデフォルトの照合とは異なる照合を指定すると、既存のインデックス(デフォルトの照合を使用)を利用できなくなります。インデックス付きの列を使用してクエリで照合を手動で指定する場合は、インデックスなしの列の場合とほぼ同じです(手動で指定した照合が列のデフォルトの照合と異なる場合)。これは、インデックスを単に無視するためです。 、この場合、MySQLはQuickSortを使用します(指定された照合に基づくコンパレータを使用します)。

于 2012-09-06T16:53:45.993 に答える
0

その列にインデックスがない場合、遅くなるとは思いません。インデックス付きの列では遅くなります。

最初のテーブルで Extra field = "Using index;" を取得し、2 番目のテーブルで "Using index; Using filesort" を取得します。したがって、2番目は遅くなります。

于 2012-09-06T15:38:31.053 に答える