1

可変長の用語のP​​HP配列(つまり、50の用語、400の用語)を使用して、これらの各用語をデータベースで検索する最も効率的な方法は何ですか?

私がやろうとしている検索は非常に簡単です。用語ごとに、次のことを行います。

SELECT id, post_title FROM wp_posts WHERE post_title LIKE %term%

明らかにforeach、PHPでを実行して複数のMySQLクエリを実行することはできますが、これは非常に非効率的だと思います。

私が最近試したコードには複数のORステートメントが含まれていますが、約100の用語を使用すると、実行速度が非常に遅くなるようです。

このようなものがうまくいくかどうかわかりませんか?

SELECT id, post_title FROM wp_posts WHERE post_title LIKE %term1%, %term2%, %term3%, %term4%, [...]

より効率的なSQLステートメントを使用できますか、それとも別の方法でこれを検討する必要がありますか?

4

4 に答える 4

2

ストックMySQLは、この種の検索を使用して処理できます

MATCH (post_title) AGAINST ('term1 term2 term3 term4')

この検索を行うには、を使用してテーブルに全文インデックスを追加する必要があります

ALTER TABLE wp_posts ADD FULLTEXT INDEX ft_key1(post_title);

これはLIKE%term%よりもはるかに高速ですが、フルテキストインデックスはMyISAMテーブルでのみサポートされていることに注意してください(InnoDBはMySQL 5.6以降この構文をサポートしています)。

ただし、データが大きくなるにつれて、バンドルされたMySQLの検索速度が問題になる可能性があります。この場合、SolrやSphinxなどの外部検索エンジンを使用することをお勧めします。

Sphinxに切り替えることにした場合は、このガイドをご覧くださいhttp://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

于 2012-06-26T17:50:45.380 に答える
0

MySQLを使用する最も効率的な方法は、全文検索を設定することです... http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

于 2012-06-26T15:47:34.417 に答える
0

検索中にクエリするすべてのテーブル列の値を単純に連結する単一の列を保持する追加のインデックスを作成します。このようにして、LIKE句を指定した単一のSELECTクエリを使用して、すべての列を一度に検索できます。

これは、「全文検索」と呼ばれることがよくあります。

于 2012-06-26T15:45:56.580 に答える
0

他の提案よりも効率的かどうかはわかりませんが、あなたもできるでしょう

SELECT id, post_title FROM wp_posts WHERE FIND_IN_SET(post_title, '%term1%, %term2%, %term3%, %term4%') <> 0
于 2012-06-26T19:27:38.087 に答える