2017-03-19 3 views
-1

私はmysql5.7.16でクエリを説明していますが、プラン内で「テーブルを最適化して選択する」の意味を理解できません。 私はGoogleで長い時間を探していますが、使用はありません。誰が私にアイデアを与えることができますか?mysql5.7の実行計画で「最適化されたテーブルを選択する」という意味は何ですか?

シナリオは以下の通りです:

([email protected])[(none)]>desc select count(F02) from S65.T6507; 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra      | 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+ 
| 1 | SIMPLE  | NULL | NULL  | NULL | NULL   | NULL | NULL | NULL | NULL |  NULL | Select tables optimized away | 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+------------------------------+ 
1 row in set, 1 warning (0.00 sec) 

([email protected])[(none)]>show index from S65.T6507; 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| T6507 |   0 | PRIMARY |   1 | F01   | A   | 18364472 |  NULL | NULL |  | BTREE  |   |    | 
| T6507 |   1 | F03  |   1 | F03   | A   |  69338 |  NULL | NULL |  | BTREE  |   |    | 
| T6507 |   1 | F02  |   1 | F02   | A   | 18364472 |  NULL | NULL |  | BTREE  |   |    | 
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
3 rows in set (0.00 sec) 

([email protected])[(none)]>show create table S65.T6507 \G 
*************************** 1. row *************************** 
     Table: T6507 
Create Table: CREATE TABLE `T6507` (
    `F01` int(10) unsigned NOT NULL COMMENT 'xxx', 
    `F02` int(10) unsigned NOT NULL COMMENT 'xxx', 
    `F03` int(10) unsigned NOT NULL COMMENT 'xxx', 
    `F04` decimal(20,2) unsigned NOT NULL COMMENT '..', 
    `F05` decimal(20,2) unsigned NOT NULL COMMENT '..', 
    `F06` decimal(20,2) unsigned NOT NULL COMMENT '..', 
    `F07` int(10) unsigned DEFAULT NULL COMMENT '.', 
    `F08` int(10) unsigned DEFAULT NULL COMMENT '..', 
    PRIMARY KEY (`F01`), 
    KEY `F03` (`F03`) USING BTREE, 
    KEY `F02` (`F02`) USING BTREE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='xxx' 
1 row in set (0.00 sec) 

myql version: 
mysql Ver 14.14 Distrib 5.7.16, for linux-glibc2.5 (x86_64) using EditLine wrapper 
Server version:   5.7.16-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial) 

答えて

0

あなたがインデックスされます列の数を求めているので、それはテーブルの行をカウントする必要はありません、それが直接情報を得ることができますインデックスから。

+0

インデックスを使用してクエリを検索することを意味しますか?このテーブルにはF02、F03、PRIMARYの3つのインデックスがありますが、どのインデックスが使用されているかはどのようにわかりますか? – elison

+0

重要なのは、 'COUNT(F02)'と書いたので、 'F02'のインデックスだけです。 – Barmar

0

これは5.7で新しく追加されたフレーズの具体的な使用例です。このフレーズは、EXPLAIN(エイリアスdesc)を実行するために必要なことにさらに触れることなく、答えが見つかる他の状況で使用されていました。

「害」はありません。

同様の例では、MyISAMテーブルを含む:

mysql> EXPLAIN SELECT COUNT(*) FROM mysql.user\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: NULL 
     type: NULL 
possible_keys: NULL 
      key: NULL 
     key_len: NULL 
      ref: NULL 
     rows: NULL 
     Extra: Select tables optimized away 

のMyISAMはテーブル内の行の数推測航法によるためでした。

関連する問題