暂无图片
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事务的ACID是怎么保证的?
回答 2
已采纳
MySQL事务的ACID,其中(C)一致性是最终目的。保证一致性的措施有:A原子性:靠undolog来保证(异常或执行失败后进行回滚)。D持久性:靠redolog来保证(保证当MySQL宕机或停电后,
MYSQL 最后 ORDER BY sort , SORT 不是字段, 也不是 AS 匿名字段. SORT有什么作用?
回答 3
selectid,name,btntype,permissionfromsysresourceswherebtntypein(0,1,2)andresourcetype1orderbysortMYSQ
有mysql 数据同步到sqlserver ,用什么方式比较好?
回答 4
试试通过ETLCloud操作,平台提供很多数据集成和转换功能,包括数据格式转换、数据清洗、字段映射等操作,能够将转换后的数据加载到目标系统中,可视化操作界面,刚进门也能快速上手
hive 数据库表导出到ftp上了 怎么从ftp倒进mysql或者sql server数据库?
回答 1
可以使用LOADDATAINFILE导入文本文件到mysql库中
master_connect_retry和slave_net_timeout参数的区别怎么理解?
回答 1
masterconnectretry从库连接主库失败,尝试连接主库的时间间隔。根据这个参数的设置,知道连接成功或者达到重试次数的限制。这个主要是从库连接主库的重试策略slavenettimeout是从
MySQL 可以设置一个table 来储存 join了的两个table吗?
回答 1
已采纳
1、如果你需要查询两个tablejoin的结果集,可以建一个view,这个view并不是真正的表。2、也可以用建一个临时表,如果需要定时刷新里面的数据,可以建一个procedure,然后利用event
重命名数据库的方法
回答 1
已采纳
ABC都可以
mysql中,多个时间数据相加得到了一个数字,这个数字是和分钟什么关系?
回答 2
没有直接关系,就是把时间转成数字求和,例如:mysql>selectnow()now(),round((now()now())/2),now();|now()now()|round((now()
把mysql的数据迁移到oracle 但是表结构还不一致 有人遇到过吗?
回答 1
怎么迁移的说说,才知道如何解决。
MySQL如何查看和修改系统参数?
回答 1
已采纳
在MySQL里,参数也可以叫变量,一般配置文件为:/etc/my.cnf。当MySQL实例启动时,MySQL会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通