mysql学习(三)

1.一个表中可以都多少个索引?  --可以有多个,具体还是用户自己去决定

2.如果一个表中有3个索引,那么数据要存储几份?

  ---无论索引有多少个,数据都只存储一份。

3,。如果数据只存储一份的话,那么其他的索引是如何检测到数据的呢?  

  --回表。数据在存储的时候,是必须要与 索引存储在一起的,在innodb中的存储引擎中,如果表中有主键,则数据就和主键绑定在一起,如果没有主键,则与唯一键在一起,如果没有唯一键,则会生成一个6字节的rowid,数据和rowid在一起,无论如何,都是需要一个索引列的。其他的非数据所在索引列的b+树中,叶子结点存放的数据都是数据所在索引的key值。

使用mysql所有都有什么原则?--回表、索引覆盖、最左匹配、索引下推

 

 

 

 

 详细解释如下:

 

mysql的组合索引的结构是什么样的

 

思考题:如下两个表结构以及索引情况

mysql> desc user_t;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int          | NO   | PRI | NULL    | auto_increment |
| user_name | varchar(40)  | NO   | MUL | NULL    |                |
| password  | varchar(255) | NO   |     | NULL    |                |
| age       | int          | NO   |     | NULL    |                |
| likes     | varchar(255) | YES  |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> desc user_t2;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int          | NO   | PRI | NULL    | auto_increment |
| user_name | varchar(40)  | NO   | MUL | NULL    |                |
| password  | varchar(255) | NO   |     | NULL    |                |
| age       | int          | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> show index from user_t;
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table  | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| user_t |          0 | PRIMARY         |            1 | id          | A         |           4 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| user_t |          1 | idx_name_pd_age |            1 | user_name   | A         |           3 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| user_t |          1 | idx_name_pd_age |            2 | password    | A         |           3 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| user_t |          1 | idx_name_pd_age |            3 | age         | A         |           3 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+--------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
4 rows in set (0.00 sec)

mysql> show index from user_t2;
+---------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| user_t2 |          0 | PRIMARY         |            1 | id          | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| user_t2 |          1 | idx_user_pd_age |            1 | user_name   | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| user_t2 |          1 | idx_user_pd_age |            2 | password    | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| user_t2 |          1 | idx_user_pd_age |            3 | age         | A         |           1 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+---------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
4 rows in set (0.00 sec)

当用explain查看如下SQL的执行计划时,为啥会有如下的差异:

 

mysql> explain select * from user_t where password='123456' and age=99;
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | user_t | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    25.00 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from user_t2 where password='123456' and age=99;
+----+-------------+---------+------------+-------+-----------------+-----------------+---------+------+------+----------+--------------------------+
| id | select_type | table   | partitions | type  | possible_keys   | key             | key_len | ref  | rows | filtered | Extra                    |
+----+-------------+---------+------------+-------+-----------------+-----------------+---------+------+------+----------+--------------------------+
|  1 | SIMPLE      | user_t2 | NULL       | index | idx_user_pd_age | idx_user_pd_age | 893     | NULL |    1 |   100.00 | Using where; Using index |
+----+-------------+---------+------------+-------+-----------------+-----------------+---------+------+------+----------+--------------------------+
1 row in set, 1 warning (0.00 sec)

即索引会丢失。原因如下

 

 

 

MVCC的学习

posted @ 2021-08-08 13:20  杰然不同2019  阅读(30)  评论(0编辑  收藏  举报