0

2,000,000 行のMySQLテーブルがあり、Web サイトには 1 日あたり 40.000 から 50.000 の訪問があり、PHP は合計で 1 秒あたり 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

解決策の 1 つは、 のようなパフォーマンス キラーの使用をやめることlike '%something%'です。

過去にこれを行った 1 つの方法は、独自のルックアップ テーブルを維持することです。つまり、次のような変更をテーブルに適用する挿入、更新、および削除トリガーをまとめます。

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

に変更を加えるたびにmp3list、そのテーブルに反映されます。これは、現在のソリューションよりも検索がはるかに高速になるはずです。

これにより、コストを償却するたびにではなく、更新時にどの MP3 にどの単語が含まれているかを把握するコストが移動しますselect。データベースの大部分は、書き込みよりもはるかに頻繁に読み取られるため、これにより大幅な改善が得られます。一部の DBMS は、全文検索インデックスを使用してこの機能を提供します (MySQL はその 1 つです)。

また、トリガー (およびクエリ) にいくつかのスマートを配置して、a、 、anなどのノイズ ワードを完全に無視するtheこともできます。これにより、スペースと時間の両方が節約され、保存するものをよりきめ細かく制御できます。

于 2013-06-14T01:52:58.803 に答える