2016-12-23 3 views
1

である私のクエリ:最高の指標である1ベストタイプは、いつ句等がある。ここ

SELECT name, usage_guidance, total_used_num 
FROM tags 
WHERE 
(name LIKE CONCAT('%', ?, '%') OR 
    usage_guidance LIKE CONCAT(?, '%')) 
AND name NOT IN ($in) 
ORDER BY name LIKE CONCAT('%', ?, '%') DESC, name ASC 
LIMIT 6 

  • tags(name,usage_guidance)
  • tags(usage_guidance,name)
  • tags(name)
  • tags(usage_guidance)

または任意のより良いオプションがあります!あなたが知っている、LIKEが来るとき、私は索引を作ることを混乱させている。 LIKE %somethingはインデックスの利点を全く享受しないためです。上のクエリでも、私はANDORINの両方を持っています。だから、私はこの質問にあなたの意見も知っていたのです。


は、ここに私のテーブル構造である:

CREATE TABLE `tags` (
    `id` int(11) NOT NULL, 
    `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `usage_guidance` varchar(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `parent_id` int(11) UNSIGNED DEFAULT NULL, 
    `related` int(11) UNSIGNED DEFAULT NULL, 
    `total_used_num` int(11) UNSIGNED NOT NULL, 
    `date_time` int(11) UNSIGNED NOT NULL 
) 
ENGINE=InnoDB DEFAULT CHARSET=latin1; 

そして私はオートコンプリートの提案クエリを作成しようとしています。このような何か:

enter image description here

+0

@barmar、*フルテキスト*を使用しているのは、私が探しているものには適していません。*フルテキスト*は検索ベースの1文字です。 – stack

+0

FTSを使用できない場合は、運が悪いだけです。 '%'で始まる検索のインデックスを作成する方法はありません。 – Barmar

+0

これは、SOがMySQLを使用していない理由です。 – Barmar

答えて

3

うん、あなたがここに持っていること>、

A B-treeインデックスは=を使用 式で列の比較のために使用することができるデータベース・キラーです、 > =、<、< =、またはBETWEEN演算子。 LIKEへの引数がワイルドカード文字で始まらない定数文字列 である場合、インデックスは でもLIKE比較に使用できます。

出典:http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html

だからそれはあなたのようなクエリがインデックスを使用することができないことを意味し、その後、あなたはORに接続された2つの同類を持っています。これで十分でない場合は、NOT IN比較でもスローされます。

しかし、幸いにも、2番目のLIKE式はそれほど悪くはありませんが、ワイルドカードで始まらないのです。 usage_guidance, name

あなたのSHOW CREATE TABLEと数行のサンプルデータ+予想される出力を投稿できたら、このクエリを書き直す方法があるかどうかを知ることができます。

+0

ありがとう.. upvote ..また、私の質問の更新版を見て、私はより良いクエリを書くことができますか教えてください? – stack

+0

あなたのアップデートで判断すると、重複が指す全文検索の恩恵を受けることはおそらくありません。それを反映するために質問を編集して、私は再投票を行います。 – e4c5

関連する問題