日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2025/3/19 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AliSQL 20170716版本发布 Invisible Indexes 功能和 SELECT FROM UPDATE 语法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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查詢響應,隨著業務的發展在表中積累了比較多的索引,而隨著業務的變更,有部分索引可能已經不再需要,需要做刪除處理。
在線刪除索引,變成了一個風險極高的操作,如何降低刪除索引的風險,主要評估兩點:

  • 需要統計信息展示索引的使用情況
  • 當刪除索引后,出現異常,如何快速的回滾
  • 針對這兩個點,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 statistic 和 index 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 版

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的AliSQL 20170716版本发布 Invisible Indexes 功能和 SELECT FROM UPDATE 语法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。