《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。
2018年8月9日,周四
MySQL的表中有唯一索引,设置unique_checks为0时,还能否写入重复值?
首先,即便设置unique_checks=0,也无法往唯一索引中写入重复值。
其次,设置unique_checks=0的作用在于,批量导入数据(例如load data)时,在确保导入数据中无重复值时,无需再次检查其唯一性,加快导入速度。
所以,unique_checks=0并不是允许唯一约束失效,而是再批量导数据时不再逐行检查唯一性。
2018年8月15日,周六
某人曰,在数据检索的条件中使用!=操作符时,存储引擎会放弃使用索引。 理由:因为检索的范围不能确定,所以使用索引效率不高,会被引擎自动改为全表扫描。你认可他的说法吗?
答:通常情况下,这个说法是正确的。当然,也有特殊情况,话不能说绝对了。
有一个测试表共80万条数据,其中type列只有1、2两个值,分别占比97%和3%。
这种情况下,查询条件 WHERE type != 1,是有可能也可以走索引的。
下面是两个SQL的执行计划:
mysql> desc select * from t1 where type = 1\G
************ 1. row ************
id: 1
select_type: SIMPLE
table: t1
partitions: NULL
type: ref
possible_keys: type
key: type
key_len: 4
ref: const
rows: 399731
filtered: 100.00
Extra: NULL
mysql> desc select * from t1 where type != 1\G
************ 1. row ************
id: 1
select_type: SIMPLE
table: t1
partitions: NULL
type: ref
possible_keys: type
key: type
key_len: 4
ref: const
rows: 10182
filtered: 100.00
Extra: NULL
type数据分布
mysql> select type, count(*) as cnt from t1 group by type order by cnt;
+------+--------+
| type | cnt |
+------+--------+
| 2 | 38304 |
| 1 | 761690 |
+------+--------+
2018年8月17日,周一
Redis集群的slot迁移是如何实现的?
答:迁移源slot设置为migrating 状态,迁移目标slot设置为importing状态。
在内部用dump & restore命令,把数据迁移到目标节点,迁移结束之后,移除migrating和importing状态。
在迁移过程中如果有数据访问,如果数据没迁移到目标节点,那么直接返回结果,如果迁移到目标节点,那么给客户端返回ASK重定向。