2

1 つの外部キーを持つマスター テーブルと子テーブルがあります。これら 2 つのテーブルを結合し、Explain ステートメントを使用してパフォーマンスを分析すると、

  1. パフォーマンスが最悪と見なされる「Type = ALL」として説明出力が得られます。この結合のパフォーマンスを改善するにはどうすればよいですか。

  2. 説明の出力には、キーとキーの長さの代わりに「possible_keys: cid_index」のみが表示されます

ここにテストケースがあります

 CREATE TABLE `master` (
  `mid` bigint(20) NOT NULL AUTO_INCREMENT,
  `mname` varchar(20) NOT NULL,
  PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1


select * from master;
+-----+-------+
| mid | mname |
+-----+-------+
|   1 | one   |
|   2 | two   |
+-----+-------+
2 rows in set (0.25 sec)


 CREATE TABLE `child` (
  `cid` bigint(20) NOT NULL AUTO_INCREMENT,
  `cname` varchar(10) NOT NULL,
  `Ccid` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`cid`),
  KEY `cid_index` (`Ccid`),
  CONSTRAINT `new_fk_constraint` FOREIGN KEY (`Ccid`) REFERENCES `master` (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1



 select * from child;
+-----+-------+------+
| cid | cname | Ccid |
+-----+-------+------+
|   1 | Cone  |    1 |
|   2 | ctwo  |    2 |
+-----+-------+------+
2 rows in set (0.12 sec)



explain select m.*,c.* from master m join child c on  m.mid=c.Ccid \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: m
         type: ALL
possible_keys: PRIMARY
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 2
        Extra:
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: c
         type: ALL
possible_keys: cid_index
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 2
        Extra: Using where; Using join buffer
2 rows in set (0.23 sec)
4

1 に答える 1

3

テーブルが小さすぎてフィルタリングするものが少ない場合、パフォーマンスが期待どおりにならない可能性があります。通常、where 句が x% (約 30%) を超えてフィルター処理する場合、テーブル全体のスキャンがより効率的になります。mysql のパフォーマンスを確認してください

また、インデックスを強制して、インデックスが使用されているかどうかを確認することもできます

explain select m.*,c.* 
from master m 
join child c force index(Ccid) 
on  m.mid=c.Ccid
于 2013-03-13T17:06:20.777 に答える