100%CPU使用:MySQL 2,000,000行并使用LIKE运算符进行查询

时间:2013-06-14 01:46:29

标签: php mysql search cpu-usage lag

我有{2,000}行MySQL表,我的网站每天访问量为40.000到50.000次,PHP每秒运行150次查询,MySQL CPU使用率约为90%。该网站非常缓慢。

专用服务器:AMD Opteron 8内核,16 GB DDR3。

以下是MYSQL查询详情:

Search Example: Guns And Roses
Table Storage Engine: MyISAM

Query example:

SELECT SQL_CACHE mp3list.*, likes.* FROM mp3list
   LEFT JOIN likes ON mp3list.mp3id = likes.mp3id
   WHERE mp3list.active=1 AND mp3list.songname LIKE '%guns%'
   AND mp3list.songname LIKE '%and%' AND mp3list.songname LIKE '%roses%'
   ORDER BY likes.likes DESC LIMIT 0, 15"

列“songname”为VARCHAR(255)

我想知道我要做些什么来实现更轻松的mysql搜索,如果有人可以帮助我,我将永远感激,我正在寻找解决方案数周。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

好吧,一个解决方案是停止使用像like '%something%'这样的性能杀手。

我们过去做过的一种方法是维护自己的查找表。我的意思是,将插入,更新和删除触发器组合在一起,对表格应用任何更改,如:

word      varchar(20)
id        int references mp3list(id)
primary key (word,id)

每当您对mp3list进行更改时,它都会反映到该表中,搜索速度应该比当前解决方案快得多。

这会降低您在更新时确定哪些MP3包含哪些字词的成本,而不是每次select,从而分摊成本。由于绝大多数数据库的阅读频率远远超过书面数据,因此可以带来实质性的改进。有些DBMS使用全文搜索索引提供此功能(MySQL就是其中之一)。

你甚至可以在触发器(和查询)中添加一些智能来完全忽略像aanthe这样的干扰词,从而节省空间和时间,为您提供更多对您想要存储的内容进行细粒度控制。