2011-05-13 11 views
0

私はアプリで全文検索するためにSphinxを使用しています。私はviewを使用してproductsテーブルからデータをフィルタリングし、Sphinxはこのビューにインデックスを付けます。今は、関連するタグがある商品テーブルの下にハードコードフィールドがありますが、タグが変更される可能性があり、毎回ハードコードフィールドを操作する必要があります。タグとGROUP_CONCATのある商品の表示

だから私は、私はGROUP_CONCATでビューを作成することができると考え、このような構文を私のためにすべての関連タグを一覧表示した

SELECT p.id AS id, GROUP_CONCAT(t.tag SEPARATOR '|') AS tags, 
UNIX_TIMESTAMP(p.created) AS created 
FROM products p 
INNER JOIN products_tags pt ON pt.product_id = p.id 
INNER JOIN tags t ON t.id = pt.tag_id 
AND p.deleted = 0 
AND (p.images IS NOT NULL OR p.images <> '') 
AND p.status LIKE 'listed' 
GROUP BY p.id; 

このクエリでの問題は、それが実行に年齢を取ることです。それは本当に遅いです。 1つのレコードのみを取得するには、最大5秒かかります。これはEXPLAIN出力されます。

1, SIMPLE, pt, ALL, , , , , 165029, Using temporary; Using filesort 
1, SIMPLE, p, eq_ref, PRIMARY, PRIMARY, 4, trych_default.pt.product_id, 1, Using where 
1, SIMPLE, t, eq_ref, PRIMARY, PRIMARY, 4, trych_default.pt.tag_id, 1, 

クエリまたは多分私の問題へのよりよい解決策を改善するためにどのような方法があるかどうか、私は疑問に思います。ありがとう!

答えて

3

おそらくインデックスがありません。次のスキーマでは、この同じクエリがすべてのテーブルのインデックスを打つ:ここ

CREATE TABLE `products` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `status` varchar(255) NOT NULL DEFAULT 'listed', 
    `images` varchar(255) DEFAULT NULL, 
    `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `tags` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `tag` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `products_tags` (
    `product_id` int(11) NOT NULL, 
    `tag_id` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`product_id`,`tag_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

は、EXPLAINクエリの結果は以下のとおりです。

EXPLAIN SELECT p.id AS id, GROUP_CONCAT(t.tag SEPARATOR '|') AS tags, 
UNIX_TIMESTAMP(p.created) AS created 
FROM products p 
INNER JOIN products_tags pt ON pt.product_id = p.id 
INNER JOIN tags t ON t.id = pt.tag_id 
WHERE p.deleted = 0 
AND (p.images IS NOT NULL OR p.images <> '') 
AND p.status LIKE 'listed' 
GROUP BY p.id; 

+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra  | 
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ 
| 1 | SIMPLE  | p  | index | PRIMARY  | PRIMARY | 4  | NULL   | 1 | Using where | 
| 1 | SIMPLE  | pt | ref | PRIMARY  | PRIMARY | 4  | test.p.id  | 1 | Using index | 
| 1 | SIMPLE  | t  | eq_ref | PRIMARY  | PRIMARY | 4  | test.pt.tag_id | 1 |    | 
+----+-------------+-------+--------+---------------+---------+---------+----------------+------+-------------+ 
3 rows in set (0.00 sec) 
+0

私が実際にインデックスがありませんでした!それはそんなに愚かな間違いです...しかしMatthewに感謝します!どうもありがとうございました! –

+0

問題ありません、喜んで助けてください! –

関連する問題