Abstract

在传统的关系数据库中,想要在堆表或者索引组织表中快速的检索到目标数据,添加索引是一个常用的手段,但过多的索引不但增加空间的开销,
还会带来写入性能的衰减,如何降低在线删除索引的风险,Invisible Indexes 提供了一个风险可控的方法。

在面临一个常见的业务场景,比如更新某行记录,然后查询变更后的记录内容的时候,通常都是UPDATE + SELECT 两条语句来完成,
AliSQL 扩展了语法,提供SELECT...FROM UPDATE语句,在完成update变更的同时,返回整行记录内容,减少一次网络调用。

AliSQL REPO: https://github.com/alibaba/AliSQL
AliSQL Release Notes: https://github.com/alibaba/AliSQL/wiki/Changes-in-AliSQL-5.6.32-(2017-07-16)

1. Invisible Indexes

概要

AliSQL 为 index 增加了两个新的属性,visible/invisible,保存在FRM文件中,这两个属性决定了这个索引是否能够
被优化器使用,索引默认是visible,当变更为invisible的时候,无论是否使用了force index hint,这个索引不再会被优化器使用。
在引擎层面,这个索引属性是透明的,即引擎会继续维护索引记录变更。
注意区分disabled index属性。

语法和使用方法

新增的语法例如:

1. CREATE INDEX:CREATE TABLE t ( a INT, b INT );
CREATE INDEX a_invisible ON t(a) INVISIBLE;
CREATE INDEX b_visible ON t(b) VISIBLE;2. ALTER TABLE:ALTER TABLE t ALTER INDEX a INVISIBLE;
ALTER TABLE t1 ALTER INDEX b VISIBLE;3. SHOW CREATE TABLE:
CREATE TABLE `t` (`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,KEY `a_invisible` (`a`) /*!50616 INVISIBLE */,KEY `b_visible` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin14. SHOW INDEXES;
mysql> SHOW INDEXES FROM t;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+
| t     |          1 | a_invisible |            1 | a           | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               | NO      |
| t     |          1 | b_visible   |            1 | b           | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               | YES     |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+5. mysql> SELECT * FROM information_schema.statistics WHERE is_visible='NO';
+---------------+--------------+------------+------------+--------------+-------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | NON_UNIQUE | INDEX_SCHEMA | INDEX_NAME  | SEQ_IN_INDEX | COLUMN_NAME | COLLATION | CARDINALITY | SUB_PART | PACKED | NULLABLE | INDEX_TYPE | COMMENT | INDEX_COMMENT | IS_VISIBLE |
+---------------+--------------+------------+------------+--------------+-------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+------------+
| def           | test         | t          |          1 | test         | a_invisible |            1 | a           | A         |           0 |     NULL | NULL   | YES      | BTREE      |         |               | NO         |
+---------------+--------------+------------+------------+--------------+-------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+------------+

场景使用

在DBA的日常运维中,为了加速SQL查询响应,随着业务的发展在表中积累了比较多的索引,而随着业务的变更,有部分索引可能已经不再需要,需要做删除处理。
在线删除索引,变成了一个风险极高的操作,如何降低删除索引的风险,主要评估两点:

  1. 需要统计信息展示索引的使用情况
  2. 当删除索引后,出现异常,如何快速的回滚

针对这两个点,AliSQL提供了较完善的方法进行评估:

1. 统计信息
AliSQL提供了一个内存统计表index_statistics,来统计每张表的索引使用统计信息,如下:

mysql> select * from t where b=2;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
+------+------+
1 row in set (0.00 sec)mysql> select * from information_schema.index_statistics;
+--------------+------------+------------+-----------+
| TABLE_SCHEMA | TABLE_NAME | INDEX_NAME | ROWS_READ |
+--------------+------------+------------+-----------+
| test         | t          | b_visible  |         3 |
+--------------+------------+------------+-----------+
1 row in set (0.00 sec)

这表明 t 表中的 b_visible 索引被拿来检索了3条记录, 而t表中的其他index没有被使用过,基于这样的统计信息,
DBA可以评估一段时间,某些索引没有被使用过,就可以相对安全的进行删除。

2. 回滚
当对index进行删除的时候, 可以分两步操作:

invisible这个索引:

ALTER TABLE t ALTER INDEX a invisible;

完成后,这个索引就不会再被optimizer使用,观察一段使用,确认没有影响后,再进行安全删除:

ALTER TABLE T DROP INDEX a;

在真正的删除之前,如果出现异常,可以快速的回滚:

ALTER TABLE t ALTER INDEX a visible;

所以,通过index statisticindex invisible 功能,可以安全对索引进行在线删除。

2. SELECT FROM UPDATE

概要

为了优化在业务中使用 UPDATE + SELECT 两次调用的开销,AliSQL提供了 SELECT...FROM UPDATE 语法,
在一次SQL请求中,完成UPDATE变更和行记录返回。

语法和使用

CREATE TABLE t(a int, b int);
INSERT INTO t values(1, 1);
SELECT * FROM UPDATE t set a=a+1 where a=1;mysql> SELECT * FROM UPDATE t set a=a+1 where a=1;
+------+------+
| a    | b    |
+------+------+
|    2 |    1 |
+------+------+
1 row in set (0.00 sec)

通过 SELECT...FROM UPDATE 语法,减少一次网络调用,在核心业务集群上,收益是非常可观的。

3. InnoDB Crash

概要

InnoDB在进行表结构变更的时候,如果是online操作,并且变更过程中失败,那么对于数据字典的dirty清理会延迟清理,但master thread在淘汰长时间未使用的Dictionary Object 的时候,因为对象未清理干净,导致实例crash。
详细的bug复现过程和修复方法,可以参考:http://mysql.taobao.org/monthly/2017/06/05/

MySQL官方的BUG跟踪:https://bugs.mysql.com/bug.php?id=86607
MariaDB的BUG跟踪:https://jira.mariadb.org/browse/MDEV-13051

4. Semisync优化

概要

Semisync的 ACK receiver 线程使用了 select() 系统库调用来监听slave线程,但由于 select() 方法存在多种限制,
所以,使用 poll() 替换原来的监听方法。

其他

除了AliSQL外,你还可以看看云数据库 MySQL 版

AliSQL 20170716版本发布 Invisible Indexes 功能和 SELECT FROM UPDATE 语法相关推荐

  1. AliSQL · 特性介绍 · 支持 Invisible Indexes

    前言 MySQL 8.0 引入了 Invisible Indexes 这一个特性,对于 DBA 同学来说是一大福音,索引生命周期管理除了有和无外,又多了一种形态–可见和不可见,进而对业务SQL的调优又 ...

  2. JeecgBoot 低代码开发平台 3.5.3 版本发布,Online 功能专题升级

    项目介绍 JeecgBoot是一款企业级的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue3,Mybatis-plus,Shiro, ...

  3. ABP Framework 5.2 RC 版本发布及新增功能介绍

    本文将介绍 ABP Framework 5.2 RC 版新增的主要功能: •单层解决方案模板•API 版本控制•源代码控制移除libs文件夹•对 Swagger UI 隐藏 ABP 默认端点•CMS ...

  4. 删除隐藏版本信息 版本回退_Visual Studio Code 2019 August版本发布,新功能尝鲜

    最近微软VS团队宣布了其免费开源的编辑器Visual Studio Code的新版本.今天我们就一起来尝鲜其带来的功能变化. 概述 新版本带来了很多变化,其中最主要的亮点功能有: 保留全局搜索和替换的 ...

  5. AliSQL 20171010版本发布 Sequence兼容PostgreSQL/Oracle语法和升级TLSv1.2

    Abstract 为了增加Sequence使用的灵活性,以及方便从不同数据库进行迁移,AliSQL增加了Sequence的兼容性,兼容了PostgreSQL和Oracle的Sequence语法. 为了 ...

  6. 世界编辑器WorldEditor 1.2版本发布,八大功能强化易用性和自动化效率【文末有彩蛋】

    针对自动驾驶应用的更高需求,为了进一步提升制作高精地图的效率及准确性,世界编辑器WorldEditor 1.2版本正式发布.新版本中包含了八项核心功能,强化了软件易用性与道路的自动化生成能力,能够快速 ...

  7. ZLMS教学管理平台系统V1.2.0最新版本发布,支持纯Web视频直播点播,还带运营在线支付功能!完全免费提供!...

    ZLMS教学管理平台系统V1.2.0最新版本发布,支持纯Web视频直播,点播!还带在线支付功能! ZLMS 开发团队在综合参考了各方面的合理建议之后,经过两个多月的紧张开发及测试,终于发布V1.2.0 ...

  8. 火狐浏览器mac_Firefox火狐浏览器73.0版本发布,有哪些期待已久的新功能?

    在谷歌浏览器发布Chrome 80版本几天后,2月11日,Mozilla也发布了Firefox火狐浏览器的最新版本73.0稳定版.目前,Firefox 73.0已面向Windows.Mac.Linux ...

  9. linux每个版本发布时间,Ubuntu 21.04各版本的发布时间公布和计划功能介绍

    本文介绍Ubuntu 21.04(代号是Hirsute Hippo)各版本的发布时间和计划推出的功能. 具体发布时间公布 以下是Ubuntu 21.04 Hirsute Hippo各种版本的推出时间, ...

最新文章

  1. 比特币耶稣Roger Ver赠送中国著名经济学家巴曙松1枚比特币现金BCH
  2. 智能视觉组赛博 -10赛后反馈
  3. DL之CG:Computational Graph计算图的简介、入门、使用之详细攻略
  4. 8086中断系统——《x86汇编语言:从实模式到保护模式》读书笔记04
  5. 前端学习(2519):路由和请求
  6. STM32驱动LCD原理
  7. 20. Element innerHTML 属性
  8. 软件需求最佳实践pdf_| 专家观点 | 彭瑜:PackML成功的秘诀 ——简论软件定义包装过程的最佳实践...
  9. 安装LoadRunner时提示缺少vc2005_sp1_with_atl_fix_redist解决方案
  10. Iperf下载及使用说明
  11. 计算机桌面运维问题分类,桌面运维工程师常见面试问题汇总
  12. 域名、域名注册商、ICANN、CNNIC
  13. 在GitHub上建立自己在线简历
  14. 又是一个想当然的错误
  15. 网络负能量为何发展如此迅速?
  16. 移动的项目,在tunnel为888696的情况下创建业务
  17. 中兴echat_中兴通讯助力公共安全行业数字化转型
  18. Java对象内存布局(JOL)
  19. Loosely Coupled: The Missing Pieces of Web Services
  20. 云服务器有多少防御,高防服务器防御一般有多少?

热门文章

  1. 程序如何调堆内存_Java的内存泄漏
  2. 判断一个窗口是否有焦点_判断一个项目是否值得加盟的基本方法
  3. cad vba 打开文件对话框_CAD文件损坏?无法打开?别急,这八种方法或许能帮到你...
  4. 2008搭建php运行环镜,Win2008 PHP 配置环境怎么搭建?win2008 php运行环境搭建图文教程。...
  5. python如何创建不同元素的矩阵_Python numpy学习(2)——矩阵的用法
  6. nGQL知识点总结-20210719
  7. 基本算法之递推与递归的简单应用
  8. 《系统集成项目管理工程师》必背100个知识点-19项目管理计划的内容
  9. Jenkins修改插件下载地址为国内下载地址与安装中文插件
  10. DataGridView中的rows.Count比实际行数多1的原因以及解决办法