0

我有一个MySQL有 2,000,000 行的表,我的网站每天有 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"

“歌曲名”列是VARCHAR(255).

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

先感谢您。

4

1 回答 1

2

好吧,一种解决方案是停止使用像like '%something%'.

我们过去这样做的一种方法是维护我们自己的查找表。我的意思是,将插入、更新和删除触发器放在一起,这些触发器会将任何更改应用于表,例如:

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

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

这将计算 MP3 包含哪些单词的成本转移到更新时,而不是每次都select摊销成本。由于绝大多数数据库的读取频率远高于写入频率,因此这可以带来实质性的改进。一些 DBMS 为这个功能提供了全文搜索索引(MySQL 就是其中之一)。

您甚至可以在触发器(和查询)中添加一些技巧,以完全忽略诸如 和 之类的干扰词,a从而节省空间和时间,让您对要存储的内容进行更细粒度的控制。anthe

于 2013-06-14T01:52:58.803 回答