2012-11-13 74 views
0

我有一个表(目前)超过200.000行。 每一行都是我网站上的一个页面,我使用友情网址,例如site.com/itemName。加快MySQL字符串LIKE查询

在我的SlowQueries日志上,我有那个查询,重复了1500次,加载时间为1.5s。

这是查询:

SELECT * FROM table WHERE `name` LIKE 'S' ORDER BY id DESC LIMIT 1 

表型是MyISAM的。该字段是带有FULLTEXT索引的varchar 250。 另外,我有这个MySQLTuner结果:

-------- General Statistics -------------------------------------------------- 
[--] Skipped version check for MySQLTuner script 
[OK] Currently running supported MySQL version 5.1.61-log 
[OK] Operating on 64-bit architecture 

-------- Storage Engine Statistics ------------------------------------------- 
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster 
[--] Data in MyISAM tables: 191M (Tables: 4) 
[--] Data in InnoDB tables: 48K (Tables: 1) 
[!!] Total fragmented tables: 1 

-------- Performance Metrics ------------------------------------------------- 
[--] Up for: 1d 4h 56m 2s (3M q [34.272 qps], 37K conn, TX: 36B, RX: 3B) 
[--] Reads/Writes: 91%/9% 
[--] Total buffers: 290.0M global + 2.7M per thread (151 max threads) 
[OK] Maximum possible memory usage: 705.2M (68% of installed RAM) 
[OK] Slow queries: 0% (2K/3M) 
[OK] Highest usage of available connections: 8% (13/151) 
[OK] Key buffer size/total MyISAM indexes: 8.0M/63.3M 
[OK] Key buffer hit rate: 100.0% (581M cached/182K reads) 
[!!] Query cache efficiency: 4.7% (146K cached/3M selects) 
[OK] Query cache prunes per day: 0 
[!!] Sorts requiring temporary tables: 32% (8K temp sorts/26K sorts) 
[OK] Temporary tables created on disk: 5% (3 on disk/53 total) 
[OK] Thread cache hit rate: 99% (13 created/37K connections) 
[OK] Table cache hit rate: 53% (33 open/62 opened) 
[OK] Open file limit used: 5% (59/1K) 
[OK] Table locks acquired immediately: 99% (3M immediate/3M locks) 
[OK] InnoDB data size/buffer pool: 48.0K/8.0M 
+1

你的意思是'LIKE'S%''或类似吗?您目前的查询实际上只是'='S'' – MatBailie

+0

不,我的意思是'喜欢'S''。就我所知,名称LIKE'S'与WHERE name ='S'相同。 – Biwu

+0

在这种情况下,你有'name,id'上的索引吗?你的查询非常简单,这样一个索引应该是你需要的全部... – MatBailie

回答

1

您可能需要使用fulltext searching functions采取这些指标的优势。据我所知,LIKE不能自动使用它们。

+0

Match-against的问题是,结果并不完全是我搜索的结果。如果我搜索“西红柿”,将返回“西红柿1”和“西红柿2”。 – Biwu

+2

@Joomler - 这就是全文。如果你不需要它,请不要使用它;-) –

2

一些随机的想法:

  • WHERE name LIKE 'S'是相同的WHERE name='S'。 MySQL可能很聪明,可以生成相同的执行计划(我没有选中),但它很混乱。
  • FULLTEXT索引用于全文搜索。你没有做一个,所以索引对这个查询没有用处。您应该创建一个常规索引。
  • 您的服务器设置可能比查询执行计划的信息量少。将EXPLAINEXPLAIN EXTENDED附加到SQL代码以获取它。
+0

是的,'LIKE'S''延迟与'='S''完全相同 – Biwu

+0

@Joomler你的意思是你计算了执行计划为这两个查询并获得相同的结果? –

+0

是的,两个atm大约120ms。 – Biwu