今天嘗試一下,以面試官的視角來說說索引。
面試官:看你做過一段時間的資料庫維護,簡單介紹下索引吧?
你:索引是為表服務的一種資料結構,預設是b-tree(balance tree, 平衡樹)。它可以幫助提高查詢速度,但是會占用額外的磁碟空間。
面試官: 你剛剛說的那個b-tree介紹一下?
你: b-tree規定如果樹有m階,葉子節點可以有m個節點,至少有m/2個子節點,根節點除外,它至少得有兩個子節點。
面試官:那它和二叉樹相比是如何提高效率的?
你:一次查詢就相當於一次二分查詢,因為是m叉樹,而不是二叉樹,所以可以減少了同等資料量,查詢時經過的子節點數,而且規定必須至少有m/2個子節點,一定程度上保證了葉子節點的利用率。所以節省了訪問的時間。
面試官: 可以,你剛說索引占用了額外的磁碟空間,怎麼計算它占用了多少磁碟呢?
你: 哦,oracle把資料庫做了邏輯劃分,最大的是tablespace,它包含n個segment,segment包含n個extent,extent包含n個block,這個block就是磁碟上的資料塊,不過oracle會按自己的格式重新格式化磁碟的資料塊。在dba的表裡有一張dba_segments表。
-- 可以利用它來計算索引的大小。
select round(sum (bytes)/1024/1024/1024, 2) || ' gb' as index_size
from dba_segments
where segment_type= 'index' and segment_name = 'pm_project_pk';
-- 還可以計算表的大小。
select round(sum (bytes)/1024/1024/1024, 2) || ' gb' as table_size
from dba_segments
where segment_type= 'table' and segment_name = 'pm_project';
面試官:行,那要是索引占用的空間太大,想給它做分割槽,你會怎麼做?
你:索引是用來服務表的,所以索引分割槽應該是基於表的分割槽的來做,索引分割槽一般選擇做成本地索引,可以由資料庫自己維護,全域性索引不能和表的分割槽結構匹配,最多只能做個範圍分割槽。
分割槽的話先準備tablespace,然後建立表時按tablespace分割槽,索引也是一樣,按tablespace分割槽,就是表和索引要放在同乙個表空間裡。分割槽關鍵字就是partition。
create tablespace tbs_1 datafile '/path/tbs1.dat' size 10m
extent management local autoallocate;
-- 同上 tbs_2, tbs_3
create table pm_project (
id number(18),
name varchar2(256),
partition by range(id) (
partition d1 values less than (5300000) tablspace tbs_1,
partition d2 values less than (5600000) tablspace tbs_2,
partition d3 values less than (maxvalue) tablspace tbs_3
));create index pm_project_ind on pm_project (id)
local
( partition d1 tablspace tbs_1,
partition d2 tablspace tbs_2,
partition d3 tablspace tbs_3
);
最後通過檢視 dba_ind_partitions 檢視索引分割槽資訊。
面試官:可以可以,除了普通的索引,我們經常要用到函式,但是有時會導致索引失效,特別是在使用使用者自定義函式的時候。你會怎麼解決這個問題?
你:oracle提供基於函式的索引,所以直接為使用函式的列建立基於函式的索引就行了。
面試官:那如何檢視乙個表是否有基於函式的索引呢?
你: 首先我利用檢視dba_indexes去查下這個表的索引,並且配合index_type=function-based normal關鍵字找出。然後從檢視dba_ind_columns, dba_ind_expressions分別找出列和函式的表示式。
select * from dba_indexes
where table_name = 'pm_project' and index_type = 'function-based normal';
-- ix_pm_project_activity
select *
from dba_ind_columns
where index_name = 'ix_pm_project_activity';
-- sys_nc00031$
select *
from dba_ind_expressions
where index_name = 'ix_pm_project_activity';
-- column_expression upper(to_char("project_activity_date",'dd-mon-rrrr'))
面試官: 行,會去等通知吧。 Python Pandas之索引index相關函式
本文介紹對索引進行 重新排序reindex 以及 更換索引set index 時的用法,需要注意的是索引物件是無法進行修改的。重新索引 reindex 重新索引不是給索引重新命名,而是對索引重新排序,如果某個索引值不存在則引入缺失值。reindex函式引數型別 使用說明 index 用於索引的新序列...
Oracle筆記 之 索引 index
1.索引分類 a 唯一索引,作用是資料約束,保證資料唯一,還有就是資料索引,提高查詢效率 b 一般索引,只有資料索引的作用,2.唯一索引的建立 create unique index 索引名 on 表名 欄位名 ok,假設有乙個emploeyy表,裡面有乙個empname欄位,我們來為empname...
InfluxDB 倒排索引之Index檔案
本文主要講解influxdb中的倒排索引,influxdb和傳統的lsm tree hbase使用的模型 不一樣的地方是其內部中多了乙個倒排索引,這也是讓influxdb查詢較快的秘訣。在1.7的 版本中,influxdb提供了兩種型別的倒排索引,記憶體和磁碟的,之前只有記憶體版本的,但是隨著資料的...