加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中InnoDB引擎如何对索引的拓展

发布时间:2022-01-13 15:12:35 所属栏目:MySql教程 来源:互联网
导读:MySQL中InnoDB引擎如何对索引的扩展,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 InnoDB引擎对索引的扩展,自动追加主键值及其对执行计划的影响。 MySQL中,使用InnoDB引擎的每个表
     MySQL中InnoDB引擎如何对索引的扩展,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
 
     InnoDB引擎对索引的扩展,自动追加主键值及其对执行计划的影响。
 
 
      MySQL中,使用InnoDB引擎的每个表,创建的普通索引(即非主键索引),都会同时保存主键的值。
比如语句
CREATE TABLE t1 (
  i1 INT
NOT NULL DEFAULT 0,
  i2 INT
NOT NULL DEFAULT 0,
  d DATE
DEFAULT NULL,
  PRIMARY
KEY (i1, i2),
  INDEX k_d (d)
)
ENGINE =
InnoDB;
创建了t1表,其主键为(i1, i2),同时创建了基于d列的索引k_d,但其实在底层,InnoDB引擎将索引k_d扩展成(d,i1,i2)。
InnoDB引擎这么做,是用空间换性能,优化器在判断是否使用索引及使用哪个索引时会有更多列参考,这样可能生成更高效的执行计划,获得更好的性能。
优化器在ref、range和index_merge类型的访问,Loose Index Scan访问,连接和排序优化, MIN()/MAX()优化时使都会使用扩展列。
我们来看个例子:
root@database-one 15:15:  [gftest]>
CREATE TABLE t1 (
    ->   i1 INT
NOT NULL DEFAULT 0,
    ->   i2 INT
NOT NULL DEFAULT 0,
    ->   d DATE
DEFAULT NULL,
    ->   PRIMARY
KEY (i1, i2),
    ->   
INDEX k_d (d)
    -> )
ENGINE =
InnoDB;
Query OK, 0 rows affected (0.06 sec)
 
root@database-one 15:15:  [gftest]>
INSERT INTO t1
VALUES
    -> (1, 1,
'1998-01-01'), (1, 2,
'1999-01-01'),
    -> (1, 3,
'2000-01-01'), (1, 4,
'2001-01-01'),
    -> (1, 5,
'2002-01-01'), (2, 1,
'1998-01-01'),
    -> (2, 2,
'1999-01-01'), (2, 3,
'2000-01-01'),
    -> (2, 4,
'2001-01-01'), (2, 5,
'2002-01-01'),
    -> (3, 1,
'1998-01-01'), (3, 2,
'1999-01-01'),
    -> (3, 3,
'2000-01-01'), (3, 4,
'2001-01-01'),
    -> (3, 5,
'2002-01-01'), (4, 1,
'1998-01-01'),
    -> (4, 2,
'1999-01-01'), (4, 3,
'2000-01-01'),
    -> (4, 4,
'2001-01-01'), (4, 5,
'2002-01-01'),
    -> (5, 1,
'1998-01-01'), (5, 2,
'1999-01-01'),
    -> (5, 3,
'2000-01-01'), (5, 4,
'2001-01-01'),
    -> (5, 5,
'2002-01-01');
Query OK, 25 rows affected (0.01 sec)
Records: 25  Duplicates: 0  Warnings: 0
 
root@database-one 15:21:  [gftest]>
show index from t1;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type |
Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t1    |          0 | PRIMARY  |            1 | i1          | A         |           5 |     
NULL |
NULL   |      | BTREE      |         |               |
| t1    |          0 | PRIMARY  |            2 | i2          | A         |          25 |     
NULL |
NULL   |      | BTREE      |         |               |
| t1    |          1 | k_d      |            1 | d           | A         |           5 |     
NULL |
NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3
rows in set (0.01 sec)
在普通索引中追加扩展主键是InnoDB在底层做的,show index等语句不显示追加列,但我们可以通过其它方式来验证。

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!