首頁 資料庫 mysql教程 PostgresQL建立索引如何避免写数据锁定_MySQL

PostgresQL建立索引如何避免写数据锁定_MySQL

Jun 01, 2016 pm 01:38 PM
如何

bitsCN.com

问题源自一个帅哥在建索引发生表锁的问题。先介绍一下Postgresql的建索引语法: 
Version:9.1 


CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ name ] ON table [ USING method ]    ( { column | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )    [ WITH ( storage_parameter = value [, ... ] ) ]    [ TABLESPACE tablespace ]    [ WHERE predicate ]
登入後複製

这里不解释语法的诸多参数使用(排序,使用方法,填充因子等),主要说一下concurrently的使用场景。 
  
正常情况下Postgresql建立普通btree索引时会阻塞DML(insert,update,delete)操作,直到索引完成,期间读操作不受阻塞。当只有一个用户操作这当然没问题,但是在生产环境,并发比较高的情况下,特别是大表建索引就不能这么操作了,不然用户要跳起来骂娘了,点个按钮一天还没反应过来。 

--使用 
Postgresql提供了一个参数,可以在线建立索引的时候避免因写数据而锁表,这个参数叫concurrently。使用很简单,就是用create index concurrently来代替create index即可。 

--副作用 
当然了,使用这个参数是有副作用的,不使用这个参数建索引时DB只扫描一次表,使用这个参数时,会引发DB扫两次表,同时等待所有潜在会读到该索引的事务结束,这么一来,系统的CPU和IO,内存等会受一点影响,所以综合考虑,仍然让用户自行选择,而不是默认。 

--失败 
在使用concurrently参数建索引时,有可能会遇到失败的情况,比如建唯一索引索引发现数据有重复,又或者用户发现建索引时建错字段的,取消建索引操作了。此时该表上会存在一个索引,这是因为带这个参数的建索引命令一经发出,就首先会在系统的日志表里先插一个索引记录进去,又因为这个索引最终建失败了,所以会被标记一个INVALID的状态,如下:

postgres=# /d t_kenyon       Table "public.t_kenyon" Column |  Type   | Modifiers --------+---------+----------- col    | integer | Indexes:    "idx" btree (col) INVALID
登入後複製

--重建 
遇到上述失效的索引重建时两个办法,一个是drop index index_name,然后再执行create index concurrently。还有一个是执行reindex index_name命令,但是后者不支持concurrent参数。 

--总结 
在生产上执行创建索引命令时最好带上此参数,因为多消耗一点系统资源和时间来换取用户的不间断访问更新是相对值得的。 如果是索引重建,可以再在原基础上建立一个不同名的相同索引,然后取消老的索引。 



参考: http://www.postgresql.org/docs/9.1/static/sql-createindex.html

bitsCN.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

哈醫大臨床藥學就業是否有前途(哈醫大臨床藥學就業前景怎麼樣) 哈醫大臨床藥學就業是否有前途(哈醫大臨床藥學就業前景怎麼樣) Jan 02, 2024 pm 08:54 PM

哈醫大臨床藥學就業是否有前途(哈醫大臨床藥學就業前景怎麼樣)

Win10系統如何重置 Win10系統如何重置 Jun 29, 2023 pm 03:14 PM

Win10系統如何重置

如何查看win11電腦配置 如何查看win11電腦配置 Jun 29, 2023 pm 12:15 PM

如何查看win11電腦配置

如何清理temp資料夾 如何清理temp資料夾 Feb 22, 2024 am 09:15 AM

如何清理temp資料夾

win10鏡像如何快速下載 win10鏡像如何快速下載 Jan 07, 2024 am 11:33 AM

win10鏡像如何快速下載

解決系統重裝時的環境偵測問題 解決系統重裝時的環境偵測問題 Jan 08, 2024 pm 03:33 PM

解決系統重裝時的環境偵測問題

如何在mysql中重設密碼 如何在mysql中重設密碼 Feb 18, 2024 pm 12:41 PM

如何在mysql中重設密碼

php如何使用Phalcon3框架? php如何使用Phalcon3框架? May 31, 2023 pm 03:10 PM

php如何使用Phalcon3框架?

See all articles