国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql中數據庫索引與優化

2024-07-24 12:38:52
字體:
來源:轉載
供稿:網友

文章從最基礎的mysql索引的概念到索引的優點分析索引的原因等等,有需要了解的同學可以仔細的參考一下本文章.

一、索引的概念

索引就是加快檢索表中數據的方法。數據庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數據庫中,索引也允許數據庫程序迅速地找到表中的數據,而不必掃描整個數據庫。

二、索引的特點

1.索引可以加快數據庫的檢索速度

2.索引降低了數據庫插入、修改、刪除等維護任務的速度

3.索引創建在表上,不能創建在視圖上

4.索引既可以直接創建,也可以間接創建

5.可以在優化隱藏中,使用索引

6.使用查詢處理器執行SQL語句,在一個表上,一次只能使用一個索引

7.其他

三、索引的優點

1、選擇索引的數據類型

MySQL支持很多數據類型,選擇合適的數據類型存儲數據對性能有很大的影響。通常來說,可以遵循以下一些指導原則:

(1)越小的數據類型通常更好:越小的數據類型通常在磁盤、內存和CPU緩存中都需要更少的空間,處理起來更快。

(2)簡單的數據類型更好:整型數據比起字符,處理開銷更小,因為字符串的比較更復雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字符串來存儲時間;以及用整型數據類型存儲IP地址。

(3)盡量避免NULL:應該指定列為NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計信息以及比較運算更加復雜。你應該用0、一個特殊的值或者一個空串代替空值。

1.1、選擇標識符

選擇合適的標識符是非常重要的。選擇時不僅應該考慮存儲類型,而且應該考慮MySQL是怎樣進行運算和比較的。一旦選定數據類型,應該保證所有相關的表都使用相同的數據類型。

(1) 整型:通常是作為標識符的最好選擇,因為可以更快的處理,而且可以設置為AUTO_INCREMENT。

(2) 字符串:盡量避免使用字符串作為標識符,它們消耗更好的空間,處理起來也較慢。而且,通常來說,字符串都是隨機的,所以它們在索引中的位置也是隨機的,這會導致頁面分裂、隨機訪問磁盤,聚簇索引分裂(對于使用聚簇索引的存儲引擎)。

2、索引入門

對于任何DBMS,索引都是進行優化的最主要的因素。對于少量的數據,沒有合適的索引影響不是很大,但是,當隨著數據量的增加,性能會急劇下降。

如果對多列進行索引(組合索引),列的順序非常重要,MySQL僅能對索引最左邊的前綴進行有效的查找。例如:假設存在組合索引it1c1c2(c1,c2),查詢語句select * from t1 where c1=1 and c2=2能夠使用該索引。查詢語句select * from t1 where c1=1也能夠使用該索引。但是,查詢語句select * from t1 where c2=2不能夠使用該索引,因為沒有組合索引的引導列,即,要想使用c2列進行查找,必需出現c1等于某值。

2.1、索引的類型

索引是在存儲引擎中實現的,而不是在服務器層中實現的。所以,每種存儲引擎的索引都不一定完全相同,并不是所有的存儲引擎都支持所有的索引類型。

2.1.1、B-Tree索引

假設有如下一個表:

  1. CREATE TABLE People ( 
  2.  
  3.    last_name varchar(50)    not null
  4.  
  5.    first_name varchar(50)    not null
  6.  
  7.    dob        date           not null
  8.  
  9.    gender     enum('m''f'not null
  10.  
  11.    key(last_name, first_name, dob) 
  12.  
  13. ); --Vevb.com 

四、索引的缺點

1.創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加

2.索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大

3.當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度

五、索引分類

1.直接創建索引和間接創建索引

直接創建索引:CREATE INDEX mycolumn_index ON mytable (myclumn)

間接創建索引:定義主鍵約束或者唯一性鍵約束,可以間接創建索引

2.普通索引和唯一性索引

普通索引:CREATE INDEX mycolumn_index ON mytable (myclumn)

唯一性索引:保證在索引列中的全部數據是唯一的,對聚簇索引和非聚簇索引都可以使用:CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

3.單個索引和復合索引

單個索引:即非復合索引

復合索引:又叫組合索引,在索引建立語句中同時包含多個字段名,最多16個字段:

CREATE INDEX name_index ON username(firstname,lastname)

4.聚簇索引和非聚簇索引(聚集索引,群集索引)

聚簇索引:物理索引,與基表的物理順序相同,數據值的順序總是按照順序排列

CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH

ALLOW_DUP_ROW(允許有重復記錄的聚簇索引)

非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)

六、索引的使用

1.當字段數據更新頻率較低,查詢使用頻率較高并且存在大量重復值是建議使用聚簇索引

2.經常同時存取多列,且每列都含有重復值可考慮建立組合索引

3.復合索引的前導列一定好控制好,否則無法起到索引的效果。如果查詢時前導列不在查詢條件中則該復合索引不會被使用。前導列一定是使用最頻繁的列

4.多表操作在被實際執行前,查詢優化器會根據連接條件,列出幾組可能的連接方案并從中找出系統開銷最小的最佳方案。連接條件要充份考慮帶有索引的表、行數多的表;內外表的選擇可由公式:外層表中的匹配行數*內層表中每一次查找的次數確定,乘積最小為最佳方案

5.where子句中對列的任何操作結果都是在sql運行時逐列計算得到的,因此它不得不進行表搜索,而沒有使用該列上面的索引;如果這些結果在查詢編譯時就能得到,那么就可以被sql優化器優化,使用索引,避免表搜索(例:select * from record where substring(card_no,1,4)=’5378′  && select * from record where card_no like ‘%78%’)任何對列的操作都將導致表掃描,它包括數據庫函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊

6.where條件中的’in’在邏輯上相當于’or’,所以語法分析器會將in (’0′,’1′)轉化為column=’0′ or column=’1′來執行。我們期望它會根據每個or子句分別查找,再將結果相加,這樣可以利用column上的索引;但實際上它卻采用了”or策略”,即先取出滿足每個or子句的行,存入臨時數據庫的工作表中,再建立唯一索引以去掉重復行,最后從這個臨時表中計算結果。因此,實際過程沒有利用column上索引,并且完成時間還要受tempdb數據庫性能的影響。in、or子句常會使用工作表,使索引失效;如果不產生大量重復值,可以考慮把子句拆開;拆開的子句中應該包含索引

7.要善于使用存儲過程,它使sql變得更加靈活和高效.

分析mysql索引效率

方法:在一般的SQL語句前加上explain;

分析結果的含義:

1)table:表名;

2)type:連接的類型,(ALL/Range/Ref)。其中ref是最理想的;

3)possible_keys:查詢可以利用的索引名;

4)key:實際使用的索引;

5)key_len:索引中被使用部分的長度(字節);

6)ref:顯示列名字或者”const”(不明白什么意思);

7)rows:顯示MySQL認為在找到正確結果之前必須掃描的行數;

8)extra:MySQL的建議;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 来安县| 龙州县| 鹤庆县| 伊川县| 察隅县| 祁阳县| 阿荣旗| 三穗县| 马边| 太谷县| 灌南县| 吉水县| 从江县| 乌苏市| 靖州| 广南县| 车险| 神木县| 荔浦县| 铜鼓县| 温泉县| 那坡县| 涿州市| 万宁市| 德钦县| 苗栗县| 博客| 苗栗县| 广灵县| 海盐县| 聊城市| 鹤山市| 宁南县| 若羌县| 大同县| 巴中市| 化德县| 永嘉县| 江达县| 安图县| 宁明县|