暂无图片
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
打赏 0
暂无图片
佳佳

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

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

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

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

暂无图片 评论
暂无图片 有用 5
打赏 0
张sir

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

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
mysql主从同步
回答 2
暂无文字回复
Windows Server 2022上安装多个版本的MySQL服务
回答 8
顶一下,有知道的大佬吗?
digest,dumpslow工具如何分析一个时间段的慢日志??
回答 1
在MySQL中,可以使用 ptquerydigest 和 mysqldumpslow 工具来分析特定时间段的慢查询日志。以下是具体步骤:一、使用 pt
MySQL server-id 为什么不生效?
回答 7
已采纳
serverid值有最大限制,你这个配置超过最大值了,把serverid调小吧。。。。
mysql和mongodb的区别
回答 3
已采纳
mongodb是文件存储的数据库。MySQL是关系型数据库。针对的场景不一样。
有没有mysql简单能够生成 html格式的慢sql报告的方法或者脚本?
回答 2
这是简单啊设置产生LOGOUTPUT'TABLE' 然后使用MYSQL客户端参数HTML  输入SQL输出HTML
MySQL 怎么在一个过程里用变量或者临时表接收另一个过程select的表?
回答 1
可以利用递归存储过程,一个简历临时表存储需要的数据,一个利用临时表操作。或者直接在过程里面调用另一个过程
MySQL 直接join,,,on默认是内连接吗?
回答 1
msyql前导列索引问题
回答 3
已采纳
可以通过OPTIMIZERTRACE看看。应该走索引的“bestcoveringindexscan”:{“index”:“xxoo”,“cost”:0.35,“chosen”:true},MySQL5
mysql5.7 添加索引很慢,表20M,没有人在用processlist 中看到 Waiting for table metadata lock 。alter table add column。这个问题怎么处理?
回答 1
加列和加索引分开做。两个必然相互影响。