0

クエリ

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
4

1 に答える 1

1

インデックスが最大限に活用されているかどうかはわかりません。の結合タイプrefはそれほど優れていません。eq_refそしてconstはるかに優れています。

rowsこの列では、MySQLがから多数の行を読み取ることを期待していることがわかりますloyalty_visits。ただし、主キーで行を検索しないため、クラスター化インデックスを使用できません。これは、MySQLがおそらく多くのディスク読み取りを実行する必要があることを意味するため、インデックスはほとんど役に立ちません。

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

于 2012-05-03T20:14:26.503 に答える