快捷搜索:
您的位置:美高梅集团4858 > 科技技术 > 《叶问》第7期

《叶问》第7期

2019-09-28 09:49

其次,设置unique_checks=0的作用在于,批量导入数据(例如load data)时,在确保导入数据中无重复值时,无需再次检查其唯一性,加快导入速度。

见上面4.DERIVED的例子。其中第一行的type就是为system,第二行是const,这两种联接类型是最快的。

在内部用dump & restore命令,把数据迁移到目标节点,迁移结束之后,移除migrating和importing状态。

3.Range checked for each record

这种情况下,查询条件 WHERE type != 1,是有可能也可以走索引的。

  1. mysql> explain select user_id from t_order group by user_id; 
  2. +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ 
  3. | id | select_type | table   | type  | possible_keys | key     | key_len | ref  | rows | Extra                    | 
  4. +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ 
  5. |  1 | SIMPLE      | t_order | range | NULL          | user_id | 5       | NULL |    3 | Using index for group-by | 
  6. +----+-------------+---------+-------+---------------+---------+---------+------+------+--------------------------+ 
  7. 1 row in set (0.00 sec) 

2.2、kill -9。不会删除临时文件,也不会执行InnoDB Recovered流程并且报错 Operating system error number 2 in a file operation ....OS error: 71

  1. mysql> explain select * from t_order a,t_order_ext b where a.order_id=b.order_id and a.order_id=100; 
  2. +----+-------------+-------+-------+---------------+----------+---------+-------+------+-------+ 
  3. | id | select_type | table | type  | possible_keys | key      | key_len | ref   | rows | Extra | 
  4. +----+-------------+-------+-------+---------------+----------+---------+-------+------+-------+ 
  5. |  1 | SIMPLE      | a     | const | PRIMARY       | PRIMARY  | 4       | const |    1 |       | 
  6. |  1 | SIMPLE      | b     | ref   | order_id      | order_id | 4       | const |    1 |       | 
  7. +----+-------------+-------+-------+---------------+----------+---------+-------+------+-------+ 
  8. 2 rows in set (0.00 sec) 

2018年8月17日,周一

当union作为子查询时,其中第二个union的select_type就是DEPENDENT UNION。
第一个子查询的select_type则是DEPENDENT SUBQUERY。

原标题:《叶问》第7期

这是性能很高的一种情况。当查询所需的数据可以直接从索引树中检索到时,就会出现。上面的例子中有很多这样的例子,不再多举例了。

某人曰,在数据检索的条件中使用!=操作符时,存储引擎会放弃使用索引。 理由:因为检索的范围不能确定,所以使用索引效率不高,会被引擎自动改为全表扫描。

  1. mysql> explain select * from t_order where user_id in (100,200,300); 
  2. +----+-------------+---------+-------+---------------+---------+---------+------+------+-------------+ 
  3. | id | select_type | table   | type  | possible_keys | key     | key_len | ref  | rows | Extra       | 
  4. +----+-------------+---------+-------+---------------+---------+---------+------+------+-------------+ 
  5. |  1 | SIMPLE      | t_order | range | user_id       | user_id | 5       | NULL |    3 | Using where | 
  6. +----+-------------+---------+-------+---------------+---------+---------+------+------+-------------+ 
  7. 1 row in set (0.00 sec) 

答:通常情况下,这个说法是正确的。当然,也有特殊情况,话不能说绝对了。

5.Using index

2018年8月15日,周六

5.index_merge

答:迁移源slot设置为migrating 状态,迁移目标slot设置为importing状态。

8.range

mysql> desc select * from t1 where type = 1G ************ 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 != 1G ************ 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 | +------+--------+

该联接类型与上面的太像了,唯一的差别就是子查询查的不是主键而是非唯一索引。

首先,即便设置unique_checks=0,也无法往唯一索引中写入重复值。

当子查询是from子句时,其select_type为DERIVED。

2018年8月27日,周一

二.type的说明

在迁移过程中如果有数据访问,如果数据没迁移到目标节点,那么直接返回结果,如果迁移到目标节点,那么给客户端返回ASK重定向。

1.UNION:

2018年8月9日,周四

9.index

在开始执行alter table的过程中,在没有结束的时候,并不会写入到binglog文件中。返回搜狐,查看更多

4.DERIVED:

2.1、ctrl+c,同1.1

在进行统计时非常常见,此联接类型实际上会扫描索引树,仅比ALL快些。

1.2、kill -9。在执行ddl的时候,服务器发生意外宕机或者手动执行kill -9。待MySQL启动后,则会自动执行InnoDB Recovered流程。并且不会删除产生的临时文件,需要手工处理。

下面的例子中user_id是一个检索范围,此时mysql会使用sort_union函数来进行索引的合并。而当user_id是一个固定值时,请参看上面type说明5.index_merge的例子,此时会使用union函数进行索引合并。

你认可他的说法吗?

有必要解释一下这个长长的表格里每一列的含义:

有一个测试表共80万条数据,其中type列只有1、2两个值,分别占比97%和3%。

分类: Mysql/postgreSQL

叶问

对于Using intersect的例子可以参看下例,user_id与express_type发生了索引交叉合并。

2、添加/删除索引,采用INPLACE方式

4.Using filesort

1、添加/删除列,采用copy的方式

子查询中的第一个select其select_type为SUBQUERY。

所以,unique_checks=0并不是允许唯一约束失效,而是再批量导数据时不再逐行检查唯一性。

  1. mysql> explain select count(1) from t_order a left join t_order_ext b on a.order_id=b.order_id where b.order_id is null;  
  2. +----+-------------+-------+-------+---------------+--------------+---------+-----------------+--------+--------------------------------------+ 
  3. | id | select_type | table | type  | possible_keys | key          | key_len | ref             | rows   | Extra                                | 
  4. +----+-------------+-------+-------+---------------+--------------+---------+-----------------+--------+--------------------------------------+ 
  5. |  1 | SIMPLE      | a     | index | NULL          | express_type | 1       | NULL            | 100395 | Using index                          | 
  6. |  1 | SIMPLE      | b     | ref   | order_id      | order_id     | 4       | test.a.order_id |      1 | Using where; Using index; Not exists | 
  7. +----+-------------+-------+-------+---------------+--------------+---------+-----------------+--------+--------------------------------------+ 
  8. 2 rows in set (0.01 sec) 

MySQL的表中有唯一索引,设置unique_checks为0时,还能否写入重复值?

当通过union来连接多个查询结果时,第二个之后的select其select_type为UNION。

Redis集群的slot迁移是如何实现的?

  1. mysql> explain select * from t_order where express_type=1 and user_id=100; 
  2. +----+-------------+---------+-------------+----------------------+----------------------+---------+------+------+----------------------------------------------------+ 
  3. | id | select_type | table   | type        | possible_keys        | key                  | key_len | ref  | rows | Extra                                              | 
  4. +----+-------------+---------+-------------+----------------------+----------------------+---------+------+------+----------------------------------------------------+ 
  5. |  1 | SIMPLE      | t_order | index_merge | user_id,express_type | user_id,express_type | 5,1     | NULL |    1 | Using intersect(user_id,express_type); Using where | 
  6. +----+-------------+---------+-------------+----------------------+----------------------+---------+------+------+----------------------------------------------------+ 
  7. 1 row in set (0.00 sec) 

下面是两个SQL的执行计划:

发生这种情况一般都是需要进行优化的。mysql需要创建一张临时表用来处理此类查询。

在大表执行ddl的过程中,若临时中断,会发生什么状况,需要特别处理吗 ?

  1. mysql> explain select * from (select order_id from t_order where order_id=100) a; 
  2. +----+-------------+------------+--------+---------------+---------+---------+------+------+-------------+ 
  3. | id | select_type | table      | type   | possible_keys | key     | key_len | ref  | rows | Extra       | 
  4. +----+-------------+------------+--------+---------------+---------+---------+------+------+-------------+ 
  5. |  1 | PRIMARY     | <derived2> | system | NULL          | NULL    | NULL    | NULL |    1 |             | 
  6. |  2 | DERIVED     | t_order    | const  | PRIMARY       | PRIMARY | 4       |      |    1 | Using index | 
  7. +----+-------------+------------+--------+---------------+---------+---------+------+------+-------------+ 
  8. 2 rows in set (0.03 sec) 

1.1、ctrl+c。在当前session中,手动执行ctrl+c。无影响,并且会自动删除产生的临时文件。

先看一个例子:

责任编辑:

  1. mysql> explain select * from t_order where user_id in (select user_id from t_order where order_id>10); 
  2. +----+--------------------+---------+----------------+-----------------+---------+---------+------+--------+--------------------------+ 
  3. | id | select_type        | table   | type           | possible_keys   | key     | key_len | ref  | rows   | Extra                    | 
  4. +----+--------------------+---------+----------------+-----------------+---------+---------+------+--------+--------------------------+ 
  5. |  1 | PRIMARY            | t_order | ALL            | NULL            | NULL    | NULL    | NULL | 100649 | Using where              | 
  6. |  2 | DEPENDENT SUBQUERY | t_order | index_subquery | PRIMARY,user_id | user_id | 5       | func |  50324 | Using index; Using where | 
  7. +----+--------------------+---------+----------------+-----------------+---------+---------+------+--------+--------------------------+ 
  8. 2 rows in set (0.00 sec) 

《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。

 

前提说明:MySQL5.7.23、innodb表、“双1”

当有where子句时,extra都会有说明。

6.Using temporary

加上extended后之后:

  1. mysql> explain select * from t_order; 
  2. +----+-------------+---------+------+---------------+------+---------+------+--------+-------+ 
  3. | id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | Extra | 
  4. +----+-------------+---------+------+---------------+------+---------+------+--------+-------+ 
  5. |  1 | SIMPLE      | t_order | ALL  | NULL          | NULL | NULL    | NULL | 100453 |       | 
  6. +----+-------------+---------+------+---------------+------+---------+------+--------+-------+ 
  7. 1 row in set (0.03 sec) 
  1. mysql> explain select * from t_order where order_id in (select order_id from t_order where user_id=10); 
  2. +----+--------------------+---------+-----------------+-----------------+---------+---------+------+--------+-------------+ 
  3. | id | select_type        | table   | type            | possible_keys   | key     | key_len | ref  | rows   | Extra       | 
  4. +----+--------------------+---------+-----------------+-----------------+---------+---------+------+--------+-------------+ 
  5. |  1 | PRIMARY            | t_order | ALL             | NULL            | NULL    | NULL    | NULL | 100649 | Using where | 
  6. |  2 | DEPENDENT SUBQUERY | t_order | unique_subquery | PRIMARY,user_id | PRIMARY | 4       | func |      1 | Using where | 
  7. +----+--------------------+---------+-----------------+-----------------+---------+---------+------+--------+-------------+ 
  8. 2 rows in set (0.00 sec) 

1.Distinct

7.index_subquery

  1. mysql> explain select * from t_order a left join t_order_ext b on a.order_id=b.order_id group by b.order_id; 
  2. +----+-------------+-------+------+---------------+----------+---------+-----------------+--------+---------------------------------+ 
  3. | id | select_type | table | type | possible_keys | key      | key_len | ref             | rows   | Extra                           | 
  4. +----+-------------+-------+------+---------------+----------+---------+-----------------+--------+---------------------------------+ 
  5. |  1 | SIMPLE      | a     | ALL  | NULL          | NULL     | NULL    | NULL            | 100395 | Using temporary; Using filesort | 
  6. |  1 | SIMPLE      | b     | ref  | order_id      | order_id | 4       | test.a.order_id |      1 |                                 | 
  7. +----+-------------+-------+------+---------------+----------+---------+-----------------+--------+---------------------------------+ 
  8. 2 rows in set (0.00 sec) 

2.Not exists

  1. mysql> explain select * from t_order order by express_type; 
  2. +----+-------------+---------+------+---------------+------+---------+------+--------+----------------+ 
  3. | id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | Extra          | 
  4. +----+-------------+---------+------+---------------+------+---------+------+--------+----------------+ 
  5. |  1 | SIMPLE      | t_order | ALL  | NULL          | NULL | NULL    | NULL | 100395 | Using filesort | 
  6. +----+-------------+---------+------+---------------+------+---------+------+--------+----------------+ 
  7. 1 row in set (0.00 sec) 

本文由美高梅集团4858发布于科技技术,转载请注明出处:《叶问》第7期

关键词:

  • 上一篇:没有了
  • 下一篇:没有了