我想在char列上连接两个表。我使用的最简单的方法是:
SELECT * FROM a JOIN b ON (a.text = b.text)
这种方法非常快,但字段的比较不区分大小写。我尝试过STRCMP(.., ..)
和.. LIKE ..
而不是.. = ..
,但两者都很慢。关于字母大小写,在char列上连接两个表的最佳解决方案是什么?
答案 0 :(得分:4)
如果始终以区分大小写的方式比较text
列,请在架构中为它们提供区分大小写的排序规则(VARCHAR BINARY
是这样做的一种方式),并且您的原始查询将起作用。
现在给每个人一个索引,使连接快速,如果它们不是键。
答案 1 :(得分:2)
不要加入字符串,而是使用代理键
答案 2 :(得分:2)
我无法运行基准测试,但您尝试过:
SELECT * FROM a JOIN b ON (BINARY a.text = BINARY b.text)
修改强>
正如旁注:使用BINARY
运算符时,a.text
和b.text
列必须使用相同的字符集,因为比较已完成在字节级别。
答案 3 :(得分:2)
尝试以下语法
SELECT * FROM a JOIN b ON (a.text = b.text AND BINARY a.text = BINARY b.text)
第一个连接条件将保留查询计划,从而保留响应时间,第二个连接条件将处理敏感性问题。
答案 4 :(得分:1)
您可以使用区分大小写的特定字符集和排序规则(f.e. latin1_bin)创建表。只需看看create table语法。在这种情况下,=运算符应该与标准设置一样快(如f.e. latin1和latin1_swedish_ci)。
答案 5 :(得分:0)
首先,检查这些列的索引。只要字段被正确编入索引,此连接在两个表中的数千行上只需几分之一秒。
其次,确保在两个表上使用相同的排序规则。如果不这样做,请为要在联接中引导的表列指定排序规则。
请注意,排序规则转换会使条件不可搜索且索引不可用。如果您希望区分大小写的比较较快,请确保在两个字段中将排序规则设置为binary
(如UTF8_BIN
)。