1. 數據結構中散列存儲和索引存儲的區別!求教 最好能生動點
散列存儲是直接將關鍵字的值做一個映射到存儲地址
索引存儲則是另外使用關鍵字來構建一個索引表(也可以是單級,也可以是多級的),先在索引表中找到存儲位置後,再訪問內容
2. Oracle中如何把表和索引放在不同的表空間里
盡量把表和索引的表空間存儲在不同在磁碟上,把兩類不同IO性質的數據分開放,這樣可以提高磁碟的IO總體性能;
2)便於管理:
試想一下,如果索引的數據文件損壞,只要創建索引即可,不會引起數據丟失的問題。
3. 數據結構的存儲方式有哪幾種
數據結構的存儲方式有順序存儲方法、鏈接存儲方法、索引存儲方法和散列存儲方法這四種。
1、順序存儲方式:順序存儲方式就是在一塊連續的存儲區域一個接著一個的存放數據,把邏輯上相連的結點存儲在物理位置上相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接掛安息來體現。順序存儲方式也稱為順序存儲結構,一般採用數組或者結構數組來描述。
2、鏈接存儲方法:它比較靈活,其不要求邏輯上相鄰的結點在物理位置上相鄰,結點間的邏輯關系由附加的引用欄位表示。一個結點的引用欄位往往指導下一個結點的存放位置。鏈接存儲方式也稱為鏈接式存儲結構,一般在原數據項中增加應用類型來表示結點之間的位置關系。
3、索引存儲方法:除建立存儲結點信息外,還建立附加的索引表來標識結點的地址。它細分為兩類:稠密索引:每個結點在索引表中都有一個索引項,索引項的地址指示結點所在的的存儲位置;稀疏索引:一組結點在索引表中只對應一個索引項,索引項的地址指示一組結點的起始存儲位置。
4、散列存儲方法:就是根據結點的關鍵字直接計算出該結點的存儲地址。
(3)索引和表結構分開存儲擴展閱讀
順序存儲和鏈接存儲的基本原理
在順序存儲中,每個存儲空間含有所存元素本身的信息,元素之間的邏輯關系是通過數組下標位置簡單計算出來的線性表的順序存儲,若一個元素存儲在對應數組中的下標位置為i,則它的前驅元素在對應數組中的下標位置為i-1,它的後繼元素在對應數組中的下標位置為i+1。
在鏈式存儲結構中,存儲結點不僅含有所存元素本身的信息,還含有元素之間邏輯關系的信息。數據的鏈式存儲結構可用鏈接表來表示。其中data表示值域,用來存儲節點的數值部分。Pl,p2,…,Pill(1n≥1)均為指針域,每個指針域為其對應的後繼元素或前驅元素所在結點的存儲位置。
在數據的順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同;而在數據的鏈接存儲中,由於每個元素的存儲位置保存在它的前驅或後繼結點中,所以只有當訪問到其前驅結點或後繼結點後才能夠按指針訪問到,訪問任一元素的時間與該元素結點在鏈式存儲結構中的位置有關。
4. mysql資料庫引擎innodb的主索引文件和表文件分開嗎
不分開,因為InnoDB表數據文件本身就是主索引,MyISAM引擎是分開的。
MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。
而InnoDB是聚集索引,就是索引文件節點中就包含了完整的數據記錄。
5. 聚集索引和非聚集索引的區別是什麼
1、查詢速度不同
聚集索引查詢數據速度快。
非聚集索引查詢數據速度慢。
2、佔用內存大小不同:
聚集索引需要較少的內存來進行操作。
非聚集索引需要更多的內存用於操作。
適用情況
1、含有大量非重復值的列。
2、使用BETWEEN,>,>=,<或<=返回一個范圍值的列
3、被連續訪問的列
4、返回大型結果集的查詢
5、經常被使用連接或GROUP BY子句的查詢訪問的列
以上內容參考:網路-聚集索引
6. mysql資料庫引擎innodb的主索引文件和表文件分開嗎如果不分開,那怎麼查詢
innodb的主索引文件和表文件沒有分開,他們在同一個表空間。
7. Mysql資料庫3種存儲引擎有什麼區別
Mysql資料庫3種存儲(MyISAM、MEMORY、InnoDB)引擎區別:
1、Myisam是Mysql的默認存儲引擎,當create創建新表時,未指定新表的存儲引擎時,默認使用Myisam。MEMORY、InnoDB不是默認存儲引擎。
2、InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比Myisam的存儲引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留數據和索引。
Mysql資料庫3種存儲(MyISAM、MEMORY、InnoDB)區別對比:
1、MyISAM
它不支持事務,也不支持外鍵,尤其是訪問速度快,對事務完整性沒有要求或者以SELECT、INSERT為主的應用基本都可以使用這個引擎來創建表。
數據文件和索引文件可以放置在不同的目錄,平均分配IO,獲取更快的速度。要指定數據文件和索引文件的路徑,需要在創建表的時候通過DATA DIRECTORY和INDEX DIRECTORY語句指定,文件路徑需要使用絕對路徑。
2、MEMORY
memory使用存在內存中的內容來創建表。每個MEMORY表實際對應一個磁碟文件,格式是.frm。MEMORY類型的表訪問非常快,因為它到數據是放在內存中的,並且默認使用HASH索引,但是一旦伺服器關閉,表中的數據就會丟失,但表還會繼續存在。
默認情況下,memory數據表使用散列索引,利用這種索引進行「相等比較」非常快,但是對「范圍比較」的速度就慢多了。因此,散列索引值適合使用在"="和"<=>"的操作符中,不適合使用在"<"或">"操作符中,也同樣不適合用在order by字句里。如果確實要使用"<"或">"或betwen操作符,可以使用btree索引來加快速度。
存儲在MEMORY數據表裡的數據行使用的是長度不變的格式,因此加快處理速度,這意味著不能使用BLOB和TEXT這樣的長度可變的數據類型。VARCHAR是一種長度可變的類型,但因為它在MySQL內部當作長度固定不變的CHAR類型,所以可以使用。
3、InnoDB
InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM的存儲引擎,InnoDB寫的處理效率差一些並且會佔用更多的磁碟空間以保留數據和索引。
(1)自動增長列:
InnoDB表的自動增長列可以手工插入,但是插入的如果是空或0,則實際插入到則是自動增長後到值。可以通過"ALTER TABLE...AUTO_INCREMENT=n;"語句強制設置自動增長值的起始值,默認為1,但是該強制到默認值是保存在內存中,資料庫重啟後該值將會丟失。
可以使用LAST_INSERT_ID()查詢當前線程最後插入記錄使用的值。如果一次插入多條記錄,那麼返回的是第一條記錄使用的自動增長值。對於InnoDB表,自動增長列必須是索引。如果是組合索引,也必須是組合索引的第一列,但是對於MyISAM表,自動增長列可以是組合索引的其他列,這樣插入記錄後,自動增長列是按照組合索引到前面幾列排序後遞增的。
(2)外鍵約束:
MySQL支持外鍵的存儲引擎只有InnoDB,在創建外鍵的時候,父表必須有對應的索引,子表在創建外鍵的時候也會自動創建對應的索引。
8. oracle中為什麼把表和表的索引建在不同的表空間會提升效率
不能簡單滴說表和索引分開表空間放就能提高效率(性能)。提高性能是有前提條件的,只有在數據表空間和索引表空間分開存放在不同磁碟的時候,由於減少了磁碟I/O的競爭,才表現出性能的提高。假如你只有一塊磁碟那麼即使分開存放了表和索引表空間,只是優化了存儲管理,對性能沒有什麼提高。
9. 按照存儲結構劃分,索引分為哪兩類各有何作用
聚集索引:對表在物理數據頁中的數據排列進行排序,然後重新存儲到磁碟上,表中的數據行只能以一種方式存儲在磁碟上,故一個表只能有一個聚集索引。創建任何非聚集索引之前必須創建聚集索引。
非聚集索引:具有完全獨立於數據行的結構,使用非聚集索引不會影響數據表中記錄的實際存儲順序。
(9)索引和表結構分開存儲擴展閱讀
優點
1.大大加快數據的檢索速度;
2.創建唯一性索引,保證資料庫表中每一行數據的唯一性;
3.加速表和表之間的連接;
4.在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。
缺點
1.索引需要佔物理空間。
2.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。
10. 說明在創建資料庫時如何合理規劃資料庫的物理存儲結構和邏輯存儲結構
Oracle資料庫的邏輯結構和物理結構
Oracle 資料庫的邏輯結構是由一些資料庫對象組成,如資料庫表空間、表、索引、段、視圖、存儲過程、觸發器等。資料庫的邏輯存儲結構(表空間等)決定了資料庫的物理空間是如何被使用的,資料庫對象如表、索引等分布在各個表空間中。
Oracle 資料庫的物理結構從操作系統一級查看,是由一個個的文件組成,從物理上可劃分為:數據文件、日誌文件、控制文件和參數文件。數據文件中存放了所有的數據信息;日誌文件存放資料庫運行期間產生的日誌信息,它被重復覆蓋使用,若不採用歸檔方式的話,已被覆蓋的日誌信息將無法恢復;控制文件記錄了整個資料庫的關鍵結構信息,它若被破壞,整個資料庫將無法工作和恢復;參數文件中設置了很多Oracle 資料庫的配置參數,當資料庫啟動時,會讀取這些信息。
邏輯結構的優化
邏輯結構優化用通俗的話來說就是通過增加、減少或調整邏輯結構來提高應用的效率,下面通過對基本表的設計及索引、聚簇的討論來分析ORACLE邏輯結構的優化。
1、基本表擴展
資料庫性能包括存儲空間需求量的大小和查詢響應時間的長短兩個方面。為了優化資料庫性能,需要對資料庫中的表進行規范化。一般來說,邏輯資料庫設計滿足第三範式的表結構容易維護且基本滿足實際應用的要求。所以,實際應用中一般都按照第三範式的標准進行規范化,從而保證了資料庫的一致性和完整性,設計人員往往會設計過多的表間關聯,以盡可能地降低數據冗餘。但在實際應用中這種做法有時不利於系統運行性能的優化:如過程從多表獲取數據時引發大量的連接操作,在需要部分數據時要掃描整個表等,這都消耗了磁碟的I/O 和CPU 時間。
為解決這一問題,在設計表時應同時考慮對某些表進行反規范化,方法有以下幾種:一是分割表。分割表可分為水平分割表和垂直分割表兩種:水平分割是按照行將一個表分割為多個表,這可以提高每個表的查詢速度,但查詢、更新時要選擇不同的表,統計時要匯總多個表,因此應用程序會更復雜。垂直分割是對於一個列很多的表,若某些列的訪問頻率遠遠高於其它列,就可以將主鍵和這些列作為一個表,將主鍵和其它列作為另外一個表。通過減少列的寬度,增加了每個數據頁的行數,一次I/O就可以掃描更多的行,從而提高了訪問每一個表的速度。但是由於造成了多表連接,所以應該在同時查詢或更新不同分割表中的列的情況比較少的情況下使用。二是保留冗餘列。當兩個或多個表在查詢中經常需要連接時,可以在其中一個表上增加若干冗餘的列,以避免表之間的連接過於頻繁,一般在冗餘列的數據不經常變動的情況下使用。三是增加派生列。派生列是由表中的其它多個列的計算所得,增加派生列可以減少統計運算,在數據匯總時可以大大縮短運算時間。
因此,在資料庫的設計中,數據應當按兩種類別進行組織:頻繁訪問的數據和頻繁修改的數據。對於頻繁訪問但是不頻繁修改的數據,內部設計應當物理不規范化。對於頻繁修改但並不頻繁訪問的數據,內部設計應當物理規范化。有時還需將規范化的表作為邏輯資料庫設計的基礎,然後再根據整個應用系統的需要,物理地非規范化數據。規范與反規范都是建立在實際的操作基礎之上的約束,脫離了實際兩者都沒有意義。只有把兩者合理地結合在一起,才能相互補充,發揮各自的優點。
2、索引和聚簇
創建索引是提高檢索效率最有效的方法之一,索引把表中的邏輯值映射到安全的RowID,能快速定位數據的物理地址,可以大大加快資料庫的查詢速度,一個建有合理索引的資料庫應用系統可能比一個沒有建立索引的資料庫應用系統效率高幾十倍,但並不是索引越多越好,在那些經常需要修改的數據列上建立索引,將導致索引B*樹的不斷重組,造成系統性能的下降和存儲空間的浪費。對於一個大型表建立的索引,有時並不能改善數據查詢速度,反而會影響整個資料庫的性能。這主要是和SGA的數據管理方式有關,Oracle在進行數據塊高速緩存管理時,索引數據比普通數據具有更高的駐留許可權,在進行空間競爭時,Oracle會先移出普通數據,對建有索引的大型表進行數據查詢時,索引數據可能會用完所有的數據塊緩存空間,Oracle不得不頻繁地進行磁碟讀寫來獲取數據,所以,在對一個大型表進行分區之後,可以根據相應的分區建立分區索引。
Oracle提供了另一種方法來提高查詢速度,就是聚簇(Cluster)。所謂聚簇,簡單地說就是把幾個表放在一起,按一定公共屬性混合存放。聚簇根據共同碼值將多個表的數據存儲在同一個Oracle塊中,這時檢索一組Oracle塊就同時得到兩個表的數據,這樣就可以減少需要存儲的Oracle塊,從而提高應用程序的性能。
對於邏輯結構的優化,還應將表數據和索引數據分開表空間存儲,分別使用獨立的表空間。因為如果將表數據和索引數據放在一起,表數據的I/O操作和索引的I/O操作將產生影響系統性能的I/O競爭,降低系統的響應效率。將表數據和索引數據存放在不同的表空間中,並在物理層面將這兩個表空間的數據文件放在不同的物理磁碟上,就可以避免這種競爭了。
物理結構的優化
資料庫的數據最終是存儲在物理磁碟上的,對數據進行訪問就是對這些物理磁碟進行讀寫,因此對於這些物理存儲的優化是系統優化的一個重要部分。對於物理存儲結構優化,主要是合理地分配邏輯結構的物理存儲地址,這樣雖不能減少對物理存儲的讀寫次數,但卻可以使這些讀寫盡量並行,減少磁碟讀寫競爭,從而提高效率,也可以通過對物理存儲進行精密的計算減少不必要的物理存儲結構擴充,從而提高系統利用率。
1、磁碟讀寫並行優化
對於資料庫的物理讀寫,Oracle系統本身會進行盡可能的並行優化,例如在一個最簡單的表檢索操作中,如果表結構和檢索域上的索引不在一個物理結構上,那麼在檢索的過程中,對索引的檢索和對表的檢索就是並行進行的。
2、操作並行優化
操作並行的優化是基於操作語句的統計結果,首先是統計各個表的訪問頻率,表之間的連接頻率,根據這些數據按如下原則分配表空間和物理磁碟,減少系統進程和用戶進程的磁碟I/O競爭;把需要連接的表格在表空間/物理磁碟上分開;把高頻訪問的表格在表空間/物理磁碟上分開;把經常需要進行檢索的表格的表結構和索引在表空間/物理磁碟上分開。
3、減少存儲結構擴展
如果應用系統的資料庫比較脆弱,並在不斷地增長或縮小,這樣的系統在非動態變化周期內效率合理,但是當在動態變化周期內的時候,性能卻很差,這是由於Oracle的動態擴展造成的。在動態擴張的過程中,Oracle必須根據存儲的要求,在創建行、行變化獲取預設值時,擴展和分配新的存儲空間,而且表格的擴展往往並不是事情的終結,還可能導致數據文件、表空間的增長,這些擴展會導致在線系統反應緩慢。對於這樣的系統,最好的辦法就是在建立的時候預先分配足夠的大小和合適的增長幅度。在一個對象建立的時候要根據應用充分地計算他們的大小,然後再根據這些數據來定義對象Initial、Next和Minextents的值,使資料庫在物理存儲上和動態增長次數上達到一個比較好的平衡點,使這些對象既不經常發生增長,也不過多地佔用資料庫。