Mysql SQL';像二进制';任何比普通';像';?
我使用的是django应用程序,它执行一些“startswith”ORM操作,将Mysql SQL';像二进制';任何比普通';像';?,mysql,sql,Mysql,Sql,我使用的是django应用程序,它执行一些“startswith”ORM操作,将longtext列与unicode字符串进行比较。这将导致使用u'mystring'unicode字符串执行类似于的二进制比较操作。LIKE二进制文件可能比普通的LIKE文件慢吗 我知道一般的答案是基准测试,但我想了解数据库的一般概念,而不仅仅是我的应用程序,因为我以前从未见过类似的二进制查询 我碰巧在使用MySQL,但我对SQL数据库的答案很感兴趣。如果性能似乎成了问题,那么最好创建一个长文本的前255个字符的副本
longtext
列与unicode字符串进行比较。这将导致使用u'mystring'
unicode字符串执行类似于的二进制
比较操作。LIKE二进制文件可能比普通的LIKE文件慢吗
我知道一般的答案是基准测试,但我想了解数据库的一般概念,而不仅仅是我的应用程序,因为我以前从未见过类似的二进制查询
我碰巧在使用MySQL,但我对SQL数据库的答案很感兴趣。如果性能似乎成了问题,那么最好创建一个长文本的前255个字符的副本,在其上添加一个索引,并使用
startswith
顺便说一句:“如果需要进行区分大小写的匹配,请将列声明为二进制;不要在查询中使用LIKE BINARY来强制转换非二进制列。如果需要,MySQL将不会对该列使用任何索引。”这是一个古老的提示,但我认为这仍然有效。对于下一个遇到此问题的人-在我们相对较小的数据库中,查询:
SELECT * FROM table_name WHERE field LIKE 'some-field-search-value';
... Result row
Returns 1 row in set (0.00 sec)
与之相比:
SELECT * FROM table_name WHERE field LIKE BINARY 'some-field-search-value';
... Result row
Returns 1 row in set (0.32 sec)
长话短说,至少对于我们的数据库(MySQL 5.5/InnoDB),两种查找在性能上有非常显著的差异
显然,虽然这是MySQL 5.5中的一个缺陷:在我对MySQL 5.1中的同一个数据库进行测试时,LIKE BINARY查询仍然使用索引(而在5.5中,它会进行全表扫描。)一个技巧:如果不想将列的类型更改为二进制,请尝试编写<代码>其中这样的语句:
WHERE field = 'yourstring' AND field LIKE BINARY 'yourstring'
而不是:
WHERE field LIKE BINARY 'yourstring'
事实上,它将非常快地检查第一个条件,并且仅当第一个条件为真时才尝试第二个条件
它在我的平等测试项目中运行良好,我认为您可以将其应用于“从开始”测试。在mysql 5.5.31中确认了这种行为。对于django来说,这意味着使用u istartswith而不是u startswith对于良好的性能非常重要。但是一个可以进行大小写折叠,而另一个不行??好吧,这取决于排序规则是否区分大小写。但是如果您的排序规则不区分大小写,并且您不想更改它,那么直接使用“LIKE BINARY”可能会有非常糟糕的性能,因为您的索引不会被使用。实际上,索引取决于排序规则。使用“=”时,引擎使用索引,而使用“LIKE BINARY”时,它需要扫描所有表并将每一行转换为二进制,以便将其与字符串进行比较。