我有{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搜索,如果有人可以帮助我,我将永远感激,我正在寻找解决方案数周。
提前谢谢。
答案 0 :(得分:2)
好吧,一个解决方案是停止使用像like '%something%'
这样的性能杀手。
我们过去做过的一种方法是维护自己的查找表。我的意思是,将插入,更新和删除触发器组合在一起,对表格应用任何更改,如:
word varchar(20)
id int references mp3list(id)
primary key (word,id)
每当您对mp3list
进行更改时,它都会反映到该表中,搜索速度应该比当前解决方案快得多。
这会降低您在更新时确定哪些MP3包含哪些字词的成本,而不是每次select
,从而分摊成本。由于绝大多数数据库的阅读频率远远超过书面数据,因此可以带来实质性的改进。有些DBMS使用全文搜索索引提供此功能(MySQL就是其中之一)。
你甚至可以在触发器(和查询)中添加一些智能来完全忽略像a
,an
和the
这样的干扰词,从而节省空间和时间,为您提供更多对您想要存储的内容进行细粒度控制。