暂无图片
innodb插入数据 默认为什么不是按照 主键 去排查
我来答
分享
佳佳
2023-11-11
innodb插入数据 默认为什么不是按照 主键 去排查

mysql> CREATE TABLE `test_test` (
-> `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
-> `uid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'uid',
-> `update_time` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'update_time 单位:s',
-> PRIMARY KEY (`id`),
-> KEY `idx_uid_update_time` (`uid`,`update_time`)
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test_test(uid,update_time) values (1,111);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test_test(uid,update_time) values (2,111);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_test(uid,update_time) values (1,222);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test_test(uid,update_time) values (1,333);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test_test;
+----+-----+-------------+
| id | uid | update_time |
+----+-----+-------------+
| 1 | 1 | 111 |
| 3 | 1 | 222 |
| 4 | 1 | 333 |
| 2 | 2 | 111 |
+----+-----+-------------+
4 rows in set (0.00 sec)

mysql> desc select * from test_test;
+----+-------------+-----------+------------+-------+---------------+---------------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------------------+---------+------+------+----------+-------------+
| 1 | SIMPLE | test_test | NULL | index | NULL | idx_uid_update_time | 16 | NULL | 4 | 100.00 | Using index |
+----+-------------+-----------+------------+-------+---------------+---------------------+---------+------+------+----------+-------------+


Q:  用的是innodb引擎,默认为啥不是按照 主键 去排查的呢。

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
chengang

由于该索引完成了索引覆盖,根本不需要回表,可以看到Extra =  Using index,又因为,一般情况下,二级索引树上的列都会比主键索引树上的列少。所以优化器肯定认为  走全索引扫描肯定表全表扫描快。 即  type = index  比 type =  all 快。


所以执行计划就是走的索引扫描。

暂无图片 评论
暂无图片 有用 3
暂无图片
佳佳

Q:  用的是innodb引擎,默认为啥不是按照 主键 去排序的呢。

暂无图片 评论
暂无图片 有用 10
佳佳
升级问题到: 潜在风险
暂无图片 评论
暂无图片 有用 6
H
hikiwi

在 MySQL 中,执行查询时,数据库优化器会尝试选择最有效的方式来检索数据。虽然主键确实是表的唯一标识符,并且通常会自动创建唯一的聚簇索引(clustered index),但在某些情况下,使用非主键索引可能更为有效。

在你创建的这张表中,idx_uid_update_time 是一个覆盖索引(covering index),它包含了查询可能涉及的所有列。查询条件和选择的列正好匹配这个索引,数据库可能会选择使用这个索引,而不是主键索引。

暂无图片 评论
暂无图片 有用 5
张sir

正常情况下主键索引树包含了所有的键值和数据,二级索引叶子节点只包含了键值和主键值,一般情况下二级索引树是比主键树要小的,如果一个查询,只通过二级索引树就能得到数据,数据库评估的代价是低于主键树的。对于你的例子,表很小,数据量也不大,选择二级索引和主键索引其实差距不大。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏