AliSQL 20170716版本发布 Invisible Indexes 功能和 SELECT FROM UPDATE 语法
Abstract
在傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)中,想要在堆表或者索引組織表中快速的檢索到目標(biāo)數(shù)據(jù),添加索引是一個(gè)常用的手段,但過(guò)多的索引不但增加空間的開(kāi)銷,
還會(huì)帶來(lái)寫入性能的衰減,如何降低在線刪除索引的風(fēng)險(xiǎn),Invisible Indexes 提供了一個(gè)風(fēng)險(xiǎn)可控的方法。
在面臨一個(gè)常見(jiàn)的業(yè)務(wù)場(chǎng)景,比如更新某行記錄,然后查詢變更后的記錄內(nèi)容的時(shí)候,通常都是UPDATE + SELECT 兩條語(yǔ)句來(lái)完成,
AliSQL 擴(kuò)展了語(yǔ)法,提供SELECT...FROM UPDATE語(yǔ)句,在完成update變更的同時(shí),返回整行記錄內(nèi)容,減少一次網(wǎng)絡(luò)調(diào)用。
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 增加了兩個(gè)新的屬性,visible/invisible,保存在FRM文件中,這兩個(gè)屬性決定了這個(gè)索引是否能夠
被優(yōu)化器使用,索引默認(rèn)是visible,當(dāng)變更為invisible的時(shí)候,無(wú)論是否使用了force index hint,這個(gè)索引不再會(huì)被優(yōu)化器使用。
在引擎層面,這個(gè)索引屬性是透明的,即引擎會(huì)繼續(xù)維護(hù)索引記錄變更。
注意區(qū)分disabled index屬性。
語(yǔ)法和使用方法
新增的語(yǔ)法例如:
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 | +---------------+--------------+------------+------------+--------------+-------------+--------------+-------------+-----------+-------------+----------+--------+----------+------------+---------+---------------+------------+場(chǎng)景使用
在DBA的日常運(yùn)維中,為了加速SQL查詢響應(yīng),隨著業(yè)務(wù)的發(fā)展在表中積累了比較多的索引,而隨著業(yè)務(wù)的變更,有部分索引可能已經(jīng)不再需要,需要做刪除處理。
在線刪除索引,變成了一個(gè)風(fēng)險(xiǎn)極高的操作,如何降低刪除索引的風(fēng)險(xiǎn),主要評(píng)估兩點(diǎn):
針對(duì)這兩個(gè)點(diǎn),AliSQL提供了較完善的方法進(jìn)行評(píng)估:
1. 統(tǒng)計(jì)信息
AliSQL提供了一個(gè)內(nèi)存統(tǒng)計(jì)表index_statistics,來(lái)統(tǒng)計(jì)每張表的索引使用統(tǒng)計(jì)信息,如下:
這表明 t 表中的 b_visible 索引被拿來(lái)檢索了3條記錄, 而t表中的其他index沒(méi)有被使用過(guò),基于這樣的統(tǒng)計(jì)信息,
DBA可以評(píng)估一段時(shí)間,某些索引沒(méi)有被使用過(guò),就可以相對(duì)安全的進(jìn)行刪除。
2. 回滾
當(dāng)對(duì)index進(jìn)行刪除的時(shí)候, 可以分兩步操作:
先invisible這個(gè)索引:
ALTER TABLE t ALTER INDEX a invisible;完成后,這個(gè)索引就不會(huì)再被optimizer使用,觀察一段使用,確認(rèn)沒(méi)有影響后,再進(jìn)行安全刪除:
ALTER TABLE T DROP INDEX a;在真正的刪除之前,如果出現(xiàn)異常,可以快速的回滾:
ALTER TABLE t ALTER INDEX a visible;所以,通過(guò)index statistic 和 index invisible 功能,可以安全對(duì)索引進(jìn)行在線刪除。
2. SELECT FROM UPDATE
概要
為了優(yōu)化在業(yè)務(wù)中使用 UPDATE + SELECT 兩次調(diào)用的開(kāi)銷,AliSQL提供了 SELECT...FROM UPDATE 語(yǔ)法,
在一次SQL請(qǐng)求中,完成UPDATE變更和行記錄返回。
語(yǔ)法和使用
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)通過(guò) SELECT...FROM UPDATE 語(yǔ)法,減少一次網(wǎng)絡(luò)調(diào)用,在核心業(yè)務(wù)集群上,收益是非常可觀的。
3. InnoDB Crash
概要
InnoDB在進(jìn)行表結(jié)構(gòu)變更的時(shí)候,如果是online操作,并且變更過(guò)程中失敗,那么對(duì)于數(shù)據(jù)字典的dirty清理會(huì)延遲清理,但master thread在淘汰長(zhǎng)時(shí)間未使用的Dictionary Object 的時(shí)候,因?yàn)閷?duì)象未清理干凈,導(dǎo)致實(shí)例crash。
詳細(xì)的bug復(fù)現(xiàn)過(guò)程和修復(fù)方法,可以參考: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優(yōu)化
概要
Semisync的 ACK receiver 線程使用了 select() 系統(tǒng)庫(kù)調(diào)用來(lái)監(jiān)聽(tīng)slave線程,但由于 select() 方法存在多種限制,
所以,使用 poll() 替換原來(lái)的監(jiān)聽(tīng)方法。
其他
除了AliSQL外,你還可以看看云數(shù)據(jù)庫(kù) MySQL 版
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的AliSQL 20170716版本发布 Invisible Indexes 功能和 SELECT FROM UPDATE 语法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: css 5
- 下一篇: SQL Server 优化---为什么索