MySQL中最快的区分大小写的字符串比较是什么?

时间:2009-09-23 12:08:14

标签: mysql

我想在char列上连接两个表。我使用的最简单的方法是:

SELECT * FROM a JOIN b ON (a.text = b.text)

这种方法非常快,但字段的比较不区分大小写。我尝试过STRCMP(.., ..).. LIKE ..而不是.. = ..,但两者都很慢。关于字母大小写,在char列上连接两个表的最佳解决方案是什么?

6 个答案:

答案 0 :(得分:4)

如果始终以区分大小写的方式比较text列,请在架构中为它们提供区分大小写的排序规则(VARCHAR BINARY是这样做的一种方式),并且您的原始查询将起作用。

现在给每个人一个索引,使连接快速,如果它们不是键。

答案 1 :(得分:2)

不要加入字符串,而是使用代理键

答案 2 :(得分:2)

我无法运行基准测试,但您尝试过:

SELECT * FROM a JOIN b ON (BINARY a.text = BINARY b.text)

修改

正如旁注:使用BINARY运算符时,a.textb.text列必须使用相同的字符集,因为比较已完成在字节级别。

答案 3 :(得分:2)

尝试以下语法

SELECT * FROM a JOIN b ON (a.text = b.text AND BINARY a.text = BINARY b.text)

第一个连接条件将保留查询计划,从而保留响应时间,第二个连接条件将处理敏感性问题。

答案 4 :(得分:1)

您可以使用区分大小写的特定字符集和排序规则(f.e. l​​atin1_bin)创建表。只需看看create table语法。在这种情况下,=运算符应该与标准设置一样快(如f.e. l​​atin1和latin1_swedish_ci)。

答案 5 :(得分:0)

首先,检查这些列的索引。只要字段被正确编入索引,此连接在两个表中的数千行上只需几分之一秒。

其次,确保在两个表上使用相同的排序规则。如果不这样做,请为要在联接中引导的表列指定排序规则。

请注意,排序规则转换会使条件不可搜索且索引不可用。如果您希望区分大小写的比较较快,请确保在两个字段中将排序规则设置为binary(如UTF8_BIN)。