私は、誰かがMySQLクエリでmsyelfよりもはるかに優れていることを望んでいます(そしてかなり確信しています)。
次の情報を含むテーブルをチェックするクエリがあります:-検索用語-この検索用語を使用したさまざまなサイトからのタイトルと価格の結果
合理化のために、スペースを削除して小文字に変換済みのデータを挿入し、MySQLサーバーの負荷を軽減するために全体を11文字にトリミングしました。
クエリは、同じタイトルの可能性が高い最大コストと最小コストを見つけ、存在する場合は価格差を判断するように設計されています。
ここでいくつかの同様の質問を読んだ後、クエリにEXPLAIN EXTENDEDを追加して、それが役立つかどうかを確認し、クエリと一緒に結果を含めました。
クエリはそのままです:
SELECT
a.pricesrch11,
b.pricesrch11,
a.pricegroup11,
b.pricegroup11,
a.priceamt - b.priceamt AS pricediff
FROM ebssavings a
LEFT JOIN ebssavings b ON ( a.pricesrch11 = b.pricesrch11 )
AND (a.pricegroup11 = a.pricesrch11)
AND (b.pricegroup11 = a.pricesrch11)
WHERE a.priceamt - b.priceamt >0
GROUP BY a.pricesrch11
EXPLAINの結果:
select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | a | ALL | pricesrch11,pricegroup11 | NULL | NULL | NULL | 8816 | Using where; Using temporary; Using filesort
1 | SIMPLE | b | ALL | pricesrch11,pricegroup11 | NULL | NULL | NULL | 6612 | Using where
補遺:
このクエリを実行したところ、次の結果が得られました。
Showing rows 0 - 4 ( 5 total, Query took 66.8119 sec)
CREATE TABLE IF NOT EXISTS ebssavings
( priceid int(44) NOT NULL auto_increment,
priceamt decimal(10,2) NOT NULL,
pricesrch11 varchar(11) character set utf8 collate utf8_unicode_ci NOT NULL,
pricegroup11 varchar(11) character set utf8 collate utf8_unicode_ci NOT NULL,
pricedate timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (priceid),
KEY priceamt (priceamt),
KEY pricesrch11 (pricesrch11),
KEY pricegroup11 (pricegroup11) )
ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8817
新しいインデックスの詳細(pricegroup11を削除し、pricesrch11とpricegroup11からsrchandtitleという複合インデックスを作成しました):
Edit Drop PRIMARY BTREE Yes No priceid 169 A
Edit Drop priceamt BTREE No No priceamt 56 A
Edit Drop pricesrch11 BTREE No No pricesrch11 12 A
Edit Drop srchandtitle BTREE No No pricesrch11 12 A
pricegroup11 169 A