2012-05-03 12 views
0

QUERYMySQLが非常に遅いクエリに参加し、説明

explain select item_name, rating 
from loyalty_visit_items 
join loyalty_visits 
on loyalty_visits.id = loyalty_visit_items.loyalty_visit_id 
where loyalty_visits.parent_venue_id = 3794 

結果

1 SIMPLE loyalty_visits  ref PRIMARY,parent_venue_id parent_venue_id 4 const      14388  
1 SIMPLE loyalty_visit_items ref loyalty_visit_id   loyalty_visit_id 5 loyalty.loyalty_visits.id 12  Using where 

を助けていないインデックスは、適切に使用しているように見える、まだこのクエリがタイムアウトする前に返さない通常ありません。このデータベースには処理するために必要なものと比べてデータはほとんどありませんので、何が起きているのだろうかと思います。私はこれをアイテムに付けるだけで、親の訪問テーブルから各アイテム行とともに列を表示します。私は完全に行方不明になっているこの結合を行うためのより良い方法はありますか?

**CREATE SHOW TABLE** 
CREATE TABLE `loyalty_visits` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `loyalty_member_id` int(11) DEFAULT NULL, 
    `venue_id` int(11) DEFAULT NULL, 
    `parent_venue_id` int(11) NOT NULL DEFAULT '0', 
    `visit_date` datetime DEFAULT NULL, 
    `check_number` double(11,0) DEFAULT NULL, 
    `code` varchar(16) DEFAULT NULL, 
    `spend` decimal(12,2) DEFAULT NULL, 
    `discount` decimal(11,0) DEFAULT NULL, 
    `cover_count` int(11) DEFAULT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    `sms_from_number` varchar(55) DEFAULT NULL, 
    `rating` int(2) DEFAULT NULL, 
    `server_id` int(11) DEFAULT NULL, 
    `server_name` varchar(255) DEFAULT NULL, 
    `terminal_id` int(11) DEFAULT NULL, 
    `initial_text_sent` tinyint(1) DEFAULT NULL, 
    `error` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `visit_date` (`visit_date`), 
    KEY `parent_venue_id` (`parent_venue_id`), 
    KEY `idx2` (`code`) USING HASH, 
    KEY `venue_id_2` (`venue_id`), 
    KEY `rating` (`rating`), 
    KEY `idx3` (`loyalty_member_id`) USING HASH, 
    KEY `spend` (`spend`), 
    KEY `id` (`id`,`parent_venue_id`) 
) ENGINE=Xeround DEFAULT CHARSET=latin1 
+0

これは役に立ちます - http://stackoverflow.com/questions/2499976/detecting-locked-tables-mysql-locked-by-lock-table – Andrew

+1

いくつかの 'SHOW CREATE TABLE'出力を見てみましょう。 – Interrobang

答えて

1

インデックスが最大限の効果を得るために使用されているかどうかはわかりません。結合タイプはrefであまりありません。 eq_refconstがはるかに優れています。

loyalty_visitsから多数の行を読み込むと、rows列に表示されます。しかし、主キーで行が見つからないため、クラスタード・インデックスを使用することはできません。これは、MySQLがおそらく多くのディスク読み取りを実行しなければならない可能性があることを意味するので、インデックスはほとんど役に立ちません。

これを最適化するにはどうすればよいですか?読み取る必要がある行の数を減らすことはできますか?クラスタード・インデックスを使用できますか?カバーインデックスを使用できますか?

+0

loyalty_visits(idおよびparent_venue_id)から引き出されている2つのフィールドのクラスタード・インデックスを作成しましたが、それは役に立たなかったようです。 – Karl

+0

@Karl InnoDBを使用している場合、主キーは*唯一のクラスタード・インデックスです。新しいクラスタード・インデックスは作成できません。可能であれば、主キーを使用するようにクエリを取得するようにしてください。 –

+0

これはおそらく私のSQLの知識限界を打つ私の場合ですが、主キー(ID)に基づいて参加しています。 – Karl

関連する問題