查询优化(基于OR)

时间:2010-03-17 15:02:16

标签: mysql

我用Google搜索,但我找不到这些问题的答案。 感谢您的建议。

带有512MB RAM的vps的centOS,nginx,php5(fastcgi),mysql5(myisam,不是innodb)。 我需要优化一些前雇员创建的这个应用程序。这个应用程序正在运行,但速度很慢。

表:

t1(id[bigint(20)],c1[mediumtext],c2[mediumtext],c3[mediumtext],c4[mediumtext])
id is some random big number, and is PK

这些中间文本行如下所示:

c1="|box-002877|"
c2="|ct-2348|rd-11124854|hw-3949|wd-8872|hw-119037736|...etc.. "
c3="|fg-2448|wd-11172|hw-1656|...etc.. "
c4="|hg-2448|qd-16667|...etc."
    (some columns contain a lot of data, around 900 KiB, database around 300 MiB)

是的,中等文字“很糟糕”,而且(20)太大......但我没有创造这个。

这些代码可以在这4个中间文本中找到......

//he needs all the columns of the row containing $code, so he wrote this:
function f1($code) {
SELECT * FROM t1 WHERE c1 LIKE '%$code%' OR c2 LIKE '%$code%' OR c3 LIKE '%$code%' OR c4 LIKE '%$code%';

问题:

  

Q1。如果在c1 ... mysql上找到$ code   自动停止检查和   返回row = id + c1 + c2 + c3 + c4?或者它会   继续(浪费时间)检查c2,   c3和c4?...

     

Q2。 Mysql正在使用此表   在磁盘上(而不是RAM)因为   中等,对吗?这是导致缓慢的主要原因吗?

     

Q3。该查询可以由mysql缓存   (如果使用大的query_cache_size = 128M   关于my.cnf的价值)?或者那不是   由于中等版本可缓存,或   由于“或喜欢”......?

     

Q4。你建议用mysql的INSTR()/ LOCATE()/ MATCH..AGAINST [FULLTEXT]重写吗?

3 个答案:

答案 0 :(得分:0)

Q1:不,它将继续搜索所有字段。如果您使用Select top 1 * from ...,则会停止查看其他字段。

Q2:这取决于你的mySQL配置,它可能是一个缓慢的原因,但它可能不是主要原因。

Q3:OR Like函数总是很慢,而在大文本上,它会慢一些,你无法做任何事情。我建议你寻找另一种方式,并摆脱那些LIKE的声明,更喜欢a = sign。

问题4:不,它会让事情变得更慢。

答案 1 :(得分:0)

  

如果在c1上找到$ code ... mysql会自动停止检查并返回row = id + c1 + c2 + c3 + c4?或者它会继续(浪费时间)检查c2,c3和c4?...

  

由于中间文本,Mysql正在使用磁盘上的这个表(而不是RAM),对吗?这是导致缓慢的主要原因吗?

不,MEDIUMTEXT由文件系统以及其他数据类型缓存。 MyISAM不支持数据页面缓存。

  

mysql可以缓存该查询(如果在my.cnf上使用了大的query_cache_size = 128M值)?或者由于中等版本或者由于“OR LIKE”而无法缓存...?

MySQL逐字缓存查询。如果您更改查询中的任何内容(包括语句的大小写,当然还有搜索的值),此查询将被视为缓存未命中并执行。缓存MEDIUMTEXT个查询以及其他查询。

  

你建议用mysql的INSTR()/ LOCATE()/ MATCH..AGAINST [FULLTEXT]重写吗?

FULLTEXT索引肯定会加快查询速度。但请确保您搜索的值不包含单词分隔符。

答案 2 :(得分:0)

为了获得最佳效果,您应该将这些文本字段分解为一个或多个表,并在其间创建一些多对多的连接表。