Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL';像二进制';任何比普通';像';?_Mysql_Sql - Fatal编程技术网

Mysql SQL';像二进制';任何比普通';像';?

Mysql SQL';像二进制';任何比普通';像';?,mysql,sql,Mysql,Sql,我使用的是django应用程序,它执行一些“startswith”ORM操作,将longtext列与unicode字符串进行比较。这将导致使用u'mystring'unicode字符串执行类似于的二进制比较操作。LIKE二进制文件可能比普通的LIKE文件慢吗 我知道一般的答案是基准测试,但我想了解数据库的一般概念,而不仅仅是我的应用程序,因为我以前从未见过类似的二进制查询 我碰巧在使用MySQL,但我对SQL数据库的答案很感兴趣。如果性能似乎成了问题,那么最好创建一个长文本的前255个字符的副本

我使用的是django应用程序,它执行一些“startswith”ORM操作,将
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”时,它需要扫描所有表并将每一行转换为二进制,以便将其与字符串进行比较。