日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

关于MySQL什么时候使用索引 什么情况下应不建或少建索引

發布時間:2023/12/31 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于MySQL什么时候使用索引 什么情况下应不建或少建索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,什么情況下使用索引

1. 表的主關鍵字

自動建立唯一索引

2. 表的字段唯一約束

ORACLE利用索引來保證數據的完整性

3. 直接條件查詢的字段

在SQL中用于條件約束的字段

如zl_yhjbqk(用戶基本情況)中的qc_bh(區冊編號)

select * from zl_yhjbqk where qc_bh=7001;

4. 查詢中與其它表關聯的字段

字段常常建立了外鍵關系

如zl_ydcf(用電成份)中的jldb_bh(計量點表編號)

select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=540100214511;

5. 查詢中排序的字段

排序的字段如果通過索引去訪問那將大大提高排序速度

select * from zl_yhjbqk order by qc_bh(建立qc_bh索引);select * from zl_yhjbqk where qc_bh=7001order by cb_sx(建立qc_bh+cb_sx索引,注:只是一個索引,其中包括qc_bh和cb_sx字段);

6. 查詢中統計或分組統計的字段

select max(hbs_bh) from zl_yhjbqk;select qc_bh,count(*) from zl_yhjbqk group by qc_bh;

二,什么情況下應不建或少建索引

1. 表記錄太少

如果一個表只有5條記錄,采用索引去訪問記錄的話,那首先需訪問索引表,再通過索引表訪問數據表,一般索引表與數據表不在同一個數據塊,這種情況下ORACLE至少要往返讀取數據塊兩次。而不用索引的情況下ORACLE會將所有的數據一次讀出,處理速度顯然會比用索引快。

如表zl_sybm(使用部門)一般只有幾條記錄,除了主關鍵字外對任何一個字段建索引都不會產生性能優化,實際上如果對這個表進行了統計分析后ORACLE也不會用你建的索引,而是自動執行全表訪問。如:

select * from zl_sybm where sydw_bh=’5401’(對sydw_bh建立索引不會產生性能優化)

2. 經常插入、刪除、修改的表

對一些經常處理的業務表應在查詢允許的情況下盡量減少索引,如zl_yhbm,gc_dfss,gc_dfys,gc_fpdy等業務表。

3. 數據重復且分布平均的表字段

假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數據庫的查詢速度。

4. 經常和主字段一塊查詢但主字段索引值比較多的表字段

如gc_dfss(電費實收)表經常按收費序號、戶標識編號、抄表日期、電費發生年月、操作 標志來具體查詢某一筆收款的情況,如果將所有的字段都建在一個索引里那將會增加數據的修改、插入、刪除時間,從實際上分析一筆收款如果按收費序號索引就已 經將記錄減少到只有幾條,如果再按后面的幾個字段索引查詢將對性能不產生太大的影響。


三、MySQL索引的概念

索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含著對數據表里所有記錄的引用指針。更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度。上述SQL語句,在沒有索引的情況下,數據庫會遍歷全部200條數據后選擇符合條件的;而有了相應的索引之后,數據庫會直接在索引中查找符合條件的選項。如果我們把SQL語句換成“SELECT * FROM article WHERE id=2000000”,那么你是希望數據庫按照順序讀取完200萬行數據以后給你結果還是直接在索引中定位呢?(注:一般數據庫默認都會為主鍵生成索引)。

索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照數據存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對于單行的檢索很快。

四、索引的類型

在數據庫表中,對字段建立索引可以大大提高查詢速度。假如我們創建了一個 mytable表

代碼如下:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT
NULL );

我們隨機向里面插入了10000條記錄,其中有一條:5555, admin。

在查找username="admin"的記錄 SELECT * FROM mytable WHERE
username=‘admin’;時,如果在username上已經建立了索引,MySQL無須任何掃描,即準確可找到該記錄。相反,MySQL會掃描所有記錄,即要查詢10000條記錄。

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。

1、普通索引
這是最基本的索引,它沒有任何限制,比如上文中為title字段創建的索引就是一個普通索引,MyIASM中默認的BTREE類型的索引,也是我們大多數情況下用到的索引。
創建方式:

  • 直接創建索引
CREATE INDEX index_name ON table(column(length));
  • 修改表結構的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length));
  • 創建表的時候同時創建索引
CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,`time` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`),INDEX index_name (title(length)) );
  • 刪除索引
DROP INDEX index_name ON table;

2、唯一索引
與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須是唯一的,創建方法和普通索引類似。

  • 創建唯一索引
CREATE UNIQUE INDEX index_name ON table(column(length));
  • 修改表結構
ALTER TABLE table_name ADD UNIQUE INDEX index_name ON (column(length));
  • 創建表時同時創建索引
CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,`time` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`),UNIQUE indexName (title(length)) );

3、主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創建主鍵索引:

// 代碼如下: CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );

當然也可以用 ALTER 命令。記住:一個表只能有一個主鍵。

4、組合索引
平時用的SQL查詢語句一般都有比較多的限制條件,所以為了進一步榨取MySQL的效率,就要考慮建立組合索引。
例如上表中針對title和time建立一個組合索引:

ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10));

建立這樣的組合索引,其實是相當于分別建立了下面兩組組合索引:

–title,time–title

為什么沒有time這樣的組合索引呢?這是因為MySQL組合索引“最左前綴”的結果。
簡單的理解就是只從最左面的開始組合。并不是只要包含這兩列的查詢都會用到該組合索引,如下面的幾個SQL所示:

  • 使用到上面的索引
SELECT * FROM article WHREE title='測試' AND time=1234567890;SELECT * FROM article WHREE utitle='測試';
  • 未使用到上面的索引
SELECT * FROM article WHREE time=1234567890;

五、索引的優化

上面說了使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。建立索引會占用磁盤空間的索引文件。一般情況這個問題不太嚴重,但如果你在一個大表上創建了多種組合索引,索引文件的會膨脹很快。索引只是提高效率的一個因素,如果你的MySQL有大數據量的表,就需要花時間研究建立最優秀的索引,或優化查詢語句。下面是一些總結以及收藏的MySQL索引的注意事項和優化方法。

1. 何時使用聚集索引或非聚集索引?

事實上,我們可以通過前面聚集索引和非聚集索引的定義的例子來理解上表。如:返回某范圍內的數據一項。比如您的某個表有一個時間列,恰好您把聚合索引建立在了該列,這時您查詢2004年1月1日至2004年10月1日之間的全部數據時,這個速度就將是很快的,因為您的這本字典正文是按日期進行排序的,聚類索引只需要找到要檢索的所有數據中的開頭和結尾數據即可;而不像非聚集索引,必須先查到目錄中查到每一項數據對應的頁碼,然后再根據頁碼查到具體內容。

2. 索引不會包含有NULL值的列

只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那么這一列對于此復合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值為NULL。

3. 使用短索引

對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字符內,多數值是惟一的,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。

4. 索引列排序

MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那么order by中的列是不會使用索引的。因此數據庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創建復合索引。

5. like語句操作

一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引。

6. 不要在列上進行運算

//例如: select * from users where YEAR(adddate)<2007;

將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成:

select * from users where adddate<2007-01-01;

關于這一點可以圍觀:一個單引號引發的MYSQL性能損失。

最后總結一下,MySQL只對以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的like(不以通配符%或_開頭的情形)。
而理論上每張表里面最多可創建16個索引,不過除非是數據量真的很多,否則過多的使用索引會引起反作用,索引雖好用,可不要太迷戀噢。


原文鏈接:

轉自:https://www.cnblogs.com/Adalia-Ting/p/9492475.html
https://blog.csdn.net/dengchenrong/article/details/88425762

總結

以上是生活随笔為你收集整理的关于MySQL什么时候使用索引 什么情况下应不建或少建索引的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。