V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  JasonLaw  ›  全部回复第 35 页 / 共 37 页
回复总数  728
1 ... 27  28  29  30  31  32  33  34  35  36 ... 37  
2020-07-12 20:54:19 +08:00
回复了 hanssx 创建的主题 MySQL 请教 order by 后面跟表达式或子查询的困惑
@JasonLaw #1 不好意思,看错了
2020-07-12 20:46:02 +08:00
回复了 hanssx 创建的主题 MySQL 请教 order by 后面跟表达式或子查询的困惑
请教一:order by 1+1 不等价于 order by 2 的原因?
这是因为你的表只有一列,所以会报错,你可以使用`order by 1`试试。

请教二:order by (select 0)不等价于 order by 0 的原因?
同样的道理,`order by ordinal`中的 ordinal 要大于 0,小于等于表的列数

详细请看 https://stackoverflow.com/questions/11353688/what-is-this-order-by-1

注意:官方文档有这么一句话
Use of column positions is deprecated because the syntax has been removed from the SQL standard.
2020-07-11 13:02:41 +08:00
回复了 JasonLaw 创建的主题 MySQL MySQL InnoDB 是否在成功插入数据之后释放了插入意向锁?
@izgnod #3 好的,期待你的回复。
2020-07-11 10:01:09 +08:00
回复了 JasonLaw 创建的主题 MySQL MySQL InnoDB 是否在成功插入数据之后释放了插入意向锁?
@izgnod #1 我做了以下实验,事实并不是你所说的那样,并不是“插入前获取辅助索引的插入意向锁,插入后获取主键的记录锁”。而且问题中的两个 schedules 也能证明你所说的是不正确的。

create table t2(id int primary key, value int, index ix_t2_value(value));
insert into t2 values (5,10),(10,5);

-- session 1
start transaction;
select * from t2 where id = 3 for share;

-- session 2
start transaction;
insert into t2 values (2, 8); -- 等待获取 PRIMARY 索引上的插入意向锁(-∞ , 5)

select * from performance_schema.data_locks 的输出为:

+--------+---------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+------------------------+-------------+-----------+
| ENGINE | ENGINE_LOCK_ID | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE | LOCK_STATUS | LOCK_DATA |
+--------+---------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+------------------------+-------------+-----------+
| INNODB | 140311361761480:1063:140311280045776 | 2072 | 50 | 14 | test | t2 | NULL | NULL | NULL | 140311280045776 | TABLE | IX | GRANTED | NULL |
| INNODB | 140311361761480:2:4:2:140311280042864 | 2072 | 50 | 14 | test | t2 | NULL | NULL | PRIMARY | 140311280042864 | RECORD | X,GAP,INSERT_INTENTION | WAITING | 5 |
| INNODB | 140311361760632:1063:140311280039632 | 421786338471288 | 48 | 22 | test | t2 | NULL | NULL | NULL | 140311280039632 | TABLE | IS | GRANTED | NULL |
| INNODB | 140311361760632:2:4:2:140311280036640 | 421786338471288 | 48 | 22 | test | t2 | NULL | NULL | PRIMARY | 140311280036640 | RECORD | S,GAP | GRANTED | 5 |
+--------+---------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+-----------------------+-----------+------------------------+-------------+-----------+



---



create table t2(id int primary key, value int, index ix_t2_value(value));
insert into t2 values (5,10),(10,5);

-- session 1
start transaction;
select * from t2 where value = 3 for share;

-- session 2
start transaction;
insert into t2 values (8, 2); -- 等待获取 ix_t2_value 索引上的插入意向锁(-∞, (5, 10))

select * from performance_schema.data_locks 的输出为:

+--------+---------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+-------------+-----------------------+-----------+------------------------+-------------+-----------+
| ENGINE | ENGINE_LOCK_ID | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE | LOCK_STATUS | LOCK_DATA |
+--------+---------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+-------------+-----------------------+-----------+------------------------+-------------+-----------+
| INNODB | 140311361761480:1063:140311280045776 | 2073 | 50 | 18 | test | t2 | NULL | NULL | NULL | 140311280045776 | TABLE | IX | GRANTED | NULL |
| INNODB | 140311361761480:2:5:3:140311280042864 | 2073 | 50 | 18 | test | t2 | NULL | NULL | ix_t2_value | 140311280042864 | RECORD | X,GAP,INSERT_INTENTION | WAITING | 5, 10 |
| INNODB | 140311361760632:1063:140311280039632 | 421786338471288 | 48 | 26 | test | t2 | NULL | NULL | NULL | 140311280039632 | TABLE | IS | GRANTED | NULL |
| INNODB | 140311361760632:2:5:3:140311280036640 | 421786338471288 | 48 | 26 | test | t2 | NULL | NULL | ix_t2_value | 140311280036640 | RECORD | S,GAP | GRANTED | 5, 10 |
+--------+---------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+-------------+-----------------------+-----------+------------------------+-------------+-----------+
2020-07-10 16:24:55 +08:00
回复了 JasonLaw 创建的主题 Java Jackson 序列化时,如何将 final 类型的类型信息保存起来?
@azygote #5 谢谢🙏

最后的代码为:

PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
.allowIfSubType(ImmutableMap.class)
.build();
ObjectMapper objectMapper = JsonMapper.builder()
.addModule(new GuavaModule())
.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.EVERYTHING)
.build();

Map<Integer, Integer> map1 = ImmutableMap.of(1, 1);

// content 为`["com.google.common.collect.SingletonImmutableBiMap",{"1":1}]`
String content = objectMapper.writeValueAsString(map1);
// 能够成功反序列化
Map<Integer, Integer> map2 = objectMapper.readValue(content, new TypeReference<Map<Integer, Integer>>() {
});
2020-07-10 14:42:17 +08:00
回复了 JasonLaw 创建的主题 Java Jackson 序列化时,如何将 final 类型的类型信息保存起来?
我现在的处理方式是使用 HashMap 作为“中间人”来实现 ImmutableMap 的序列化和反序列化。参考 https://stackoverflow.com/a/34115875/5232255
2020-07-10 14:39:46 +08:00
回复了 JasonLaw 创建的主题 Java Jackson 序列化时,如何将 final 类型的类型信息保存起来?
@xgfan #2 谢谢提示🙏

改变后的代码如下:

PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
.allowIfSubType(ImmutableMap.class)
.build();
ObjectMapper objectMapper = new ObjectMapper()
.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.EVERYTHING);

// Map<Integer, Integer> map1 = new HashMap<>();
// map1.put(1, 1);
Map<Integer, Integer> map1 = ImmutableMap.of(1, 1);

// content 为`["com.google.common.collect.SingletonImmutableBiMap",{"1":1}]`
String content = objectMapper.writeValueAsString(map1);
// 但是因为 SingletonImmutableBiMap 没有默认的构造器,反序列化报错
// com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.google.common.collect.SingletonImmutableBiMap` (no Creators, like default constructor, exist): no default constructor found
at [Source: (String)"["com.google.common.collect.SingletonImmutableBiMap",{"1":1}]"; line: 1, column: 54]
Map<Integer, Integer> map2 = objectMapper.readValue(content, new TypeReference<Map<Integer, Integer>>() {
});
2020-07-09 21:59:17 +08:00
回复了 15hop 创建的主题 程序员 mysql 查询类型 index 和 all 查询效率上的区别
@optional #6
@15hop #10

https://dev.mysql.com/doc/refman/8.0/en/innodb-index-types.html

Every InnoDB table has a special index called the clustered index where the data for the rows is stored.

Accessing a row through the clustered index is fast because the index search leads directly to the page with all the row data.

All indexes other than the clustered index are known as secondary indexes. In InnoDB, each record in a secondary index contains the primary key columns for the row, as well as the columns specified for the secondary index. InnoDB uses this primary key value to search for the row in the clustered index.
2020-07-09 21:55:39 +08:00
回复了 15hop 创建的主题 程序员 mysql 查询类型 index 和 all 查询效率上的区别
@flyfanc #1
@mayday526 #7
@chihiro2014 #8
@996635 #11
@Risin9 #12

以下是我做的一个测试。

1. 创建表(注意:id 和 value 的类型是一样的)

CREATE TABLE `t`
(
`id` int(11) NOT NULL,
`value` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;

2. 插入数据(伪代码),id 和 value 的值是一样的

for (int i = 1; i < 500000; i++) {
insert into t values (i, i);
}

3. 使用命令行登录进数据库管理系统,并使用特定的数据库

mysql -u {user} -p{password}
use database;

4. 开启 profiling

SET profiling = 1;

5. 执行以下语句

select * from t;
select id from t;
select value from t;

6. `show PROFILES;`的结果如下:

+----------+------------+---------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------+
| 1 | 0.24099925 | select * from t |
| 2 | 0.15437950 | select id from t |
| 3 | 0.14546525 | select value from t |
+----------+------------+---------------------+

参考资料:
https://dev.mysql.com/doc/refman/5.6/en/show-profile.html
https://dev.mysql.com/doc/refman/5.6/en/performance-schema-query-profiling.html
2020-07-09 20:11:43 +08:00
回复了 FenixVu 创建的主题 MySQL mysql 批量 update 问题
能够清楚地表达一下你的“为啥”是什么吗?反正我是不明白你的问题是什么
2020-07-09 13:09:36 +08:00
回复了 15hop 创建的主题 程序员 mysql 查询类型 index 和 all 查询效率上的区别
@flyfanc 两个都是使用 clustered index 吧
2020-07-09 13:08:23 +08:00
回复了 15hop 创建的主题 程序员 mysql 查询类型 index 和 all 查询效率上的区别
用 SELECT NAME FROM query_test 的结果如何呢?
2020-07-06 10:20:35 +08:00
回复了 JasonLaw 创建的主题 数据库 MySQL 是这样实现可重复读的
@louettagfh 我不是纠结细节,我只是想知道事情到底是怎样的。
2020-07-06 08:08:38 +08:00
回复了 JasonLaw 创建的主题 数据库 MySQL 是这样实现可重复读的
@UN2758 谢谢,明白了 InnoDB 具体是怎么实现的了。
2020-07-05 23:28:27 +08:00
回复了 JasonLaw 创建的主题 数据库 MySQL 是这样实现可重复读的
@louettagfh

1. 你说“一个事务可以有多条语句,s1 创建事务 t1 用 record lock 锁住了这条 record, 但它执行 t1 后面的语句时,这把 record lock 已经被放开了. 其他事务的是可以修改的 id 为 5 的 record.”,可以用实例展现一下吗?
2. 你说“MySQL 如何实现可重复读? 利用 MVCC”,其实我讲的主要是 locking read 的可重复读,而不是 consistent nonlocking read 的可重复读,可以标题有点误导吧,我会修改一下。
3. 你说创建事务时就创建 read view,这个应该不对吧?在 https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html 中,它说“If the transaction isolation level is REPEATABLE READ (the default level), all consistent reads within the same transaction read the snapshot established by the first such read in that transaction.”,“With READ COMMITTED isolation level, each consistent read within a transaction sets and reads its own fresh snapshot.”,不管是哪个级别,都不是创建事务时就去建立 snapshot 。
2020-07-05 18:59:57 +08:00
回复了 JasonLaw 创建的主题 数据库 MySQL 是这样实现可重复读的
@lhx2008 也许标题应该改一下😅,因为文章没有讲到 consistent nonlocking read,只是讲到了 locking read,虽然知道 MVCC 相关理论,但是不太了解 InnoDB 具体是怎么实现的。有空了解了之后再补充。
2020-07-05 13:54:58 +08:00
回复了 JasonLaw 创建的主题 数据库 MySQL 插入意向锁的作用是什么?
上面那篇文章是不正确的,我准备取消那篇文章的发布。不过我在这里贴出两个问题,[mysql - Is insert intention lock truly a gap lock? - Stack Overflow]( https://stackoverflow.com/questions/62712571/is-insert-intention-lock-truly-a-gap-lock)和[mysql - Does transaction release insert intention lock after insertion? - Stack Overflow]( https://stackoverflow.com/questions/62737123/does-transaction-release-insert-intention-lock-after-insertion)。欢迎大家解答这两个问题,谢谢。
2020-07-05 13:23:17 +08:00
回复了 JasonLaw 创建的主题 数据库 InnoDB LOCK_MODE X,GAP,INSERT_INTENTION 到底是什么?
@limuyan44 我不太明白你是怎么从 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 得知 X,GAP,INSERT_INTENTION 是什么类型的锁的,难道是从`trx id 8731 lock_mode X locks gap before rec insert intention waiting`得知?
2020-07-04 23:27:19 +08:00
回复了 JasonLaw 创建的主题 数据库 InnoDB LOCK_MODE X,GAP,INSERT_INTENTION 到底是什么?
@limuyan44 你说官方文档有,可以发一下相关的链接吗?我实在是找不到有官方文档说这个的。
具体原因我也不太清楚,我猜测数据是 float 类型之类的,因为自己尝试过,float 类型的时候,`lock data`就会是这种格式的数据,但是如果数据是 int 类型的话,`lock data`会是人类可读的(比如说 8 )。
1 ... 27  28  29  30  31  32  33  34  35  36 ... 37  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2465 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 15:51 · PVG 23:51 · LAX 07:51 · JFK 10:51
Developed with CodeLauncher
♥ Do have faith in what you're doing.