単一キーインデックスは1つのsqlが複数歩きますか?

4426 ワード

   sql              ,             。
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.1.48, for Win32 (ia32)

Connection id:          13
Current database:       pk_test
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.1.48-community MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:               3306
Uptime:                 43 min 42 sec

Threads: 2  Questions: 2604  Slow queries: 0  Opens: 23  Flush tables: 1  Open tables: 2  Queries per second avg: 0.993
--------------

========================================
              。


CREATE TABLE `t_carmodelparamvalue2` (
  `ModelParamValueID` int(11) NOT NULL AUTO_INCREMENT,
  `ParameterID` int(11) NOT NULL,
  `ParamValueID` int(11) DEFAULT NULL,
  `ModelID` int(11) NOT NULL,
  `ValueText` varchar(512) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `SeriesID` int(11) DEFAULT NULL,
  PRIMARY KEY (`ModelParamValueID`),
  KEY `ModelID` (`ModelID`),
  KEY `SeriesID` (`SeriesID`),
  KEY `ak_paramvalue_parameterid` (`ParameterID`)
) ENGINE=InnoDB AUTO_INCREMENT=1254098 DEFAULT CHARSET=gb2312;

mysql> select count(*) from `t_carmodelparamvalue2`;
+----------+
| count(*) |
+----------+
|      500 |
+----------+
1 row in set (0.00 sec)
mysql> explain select * from T_CarModelParamValue2 where modelid = 276666 and ParameterID = 180;
+----+-------------+-----------------------+------+-----------------------------------+---------+---------+-------+------+-------------+
| id | select_type | table                 | type | possible_keys                     | key     | key_len | ref   | rows | Extra       |
+----+-------------+-----------------------+------+-----------------------------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | T_CarModelParamValue2 | ref  | ModelID,ak_paramvalue_parameterid | ModelID | 4       | const |    1 | Using where |
+----+-------------+-----------------------+------+-----------------------------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)

===================================================

  ,            ?
CREATE TABLE `t_carmodelparamvalue` (
  `ModelParamValueID` int(11) NOT NULL AUTO_INCREMENT,
  `ParameterID` int(11) NOT NULL,
  `ParamValueID` int(11) DEFAULT NULL,
  `ModelID` int(11) NOT NULL,
  `ValueText` varchar(512) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `SeriesID` int(11) DEFAULT NULL,
  PRIMARY KEY (`ModelParamValueID`),
  KEY `ModelID` (`ModelID`),
  KEY `SeriesID` (`SeriesID`),
  KEY `ak_paramvalue_parameterid` (`ParameterID`)
) ENGINE=InnoDB AUTO_INCREMENT=1253591 DEFAULT CHARSET=gb2312;

mysql> select count(*) from `t_carmodelparamvalue`;
+----------+
| count(*) |
+----------+
|  1189500 |
+----------+
1 row in set (2.73 sec)
mysql> explain select * from T_CarModelParamValue where modelid = 276666 and ParameterID = 180;
+----+-------------+----------------------+-------------+-----------------------------------+-----------------------------------+---------+------+----
--+-----------------------------------------------------------------+
| id | select_type | table                | type        | possible_keys                     | key                               | key_len | ref  | rows | Extra                                                           |
+----+-------------+----------------------+-------------+-----------------------------------+-----------------------------------+---------+------+------+-----------------------------------------------------------------+
|  1 | SIMPLE      | T_CarModelParamValue | index_merge | ModelID,ak_paramvalue_parameterid | ModelID,ak_paramvalue_parameterid | 4,4     | NULL |1 | Using intersect(ModelID,ak_paramvalue_parameterid); Using where |
+----+-------------+----------------------+-------------+-----------------------------------+-----------------------------------+---------+------+------+-----------------------------------------------------------------+
1 row in set (0.00 sec)
      。

表現を見ると、データ量が百万に達すると複数歩くという結論に達した.
実は、1つのテーブルがinsert、select、変換エンジンなどの操作を大量にした場合、この問題が発生します.
その百万級の時計を空にしてから、やはり複数のエンジンを先に行きます.