我用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]重写吗?
答案 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)
为了获得最佳效果,您应该将这些文本字段分解为一个或多个表,并在其间创建一些多对多的连接表。