日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
提高數(shù)據(jù)庫查詢效率的方法:創(chuàng)建多字段索引(數(shù)據(jù)庫創(chuàng)建多字段索引)

在當(dāng)今信息化時(shí)代,數(shù)據(jù)庫已經(jīng)成為各種企業(yè)、機(jī)構(gòu)和組織中必不可少的數(shù)據(jù)管理工具,通過對各類數(shù)據(jù)進(jìn)行存儲、查詢、更新等操作,為組織決策和業(yè)務(wù)運(yùn)營提供重要的支撐。然而,如果不對數(shù)據(jù)庫的性能進(jìn)行優(yōu)化,長時(shí)間使用容易出現(xiàn)查詢緩慢甚至崩潰的問題,給用戶和業(yè)務(wù)帶來相當(dāng)大的困擾和損失。為了解決這類問題,本文將探討一種。

成都創(chuàng)新互聯(lián)于2013年開始,先為湟源等服務(wù)建站,湟源等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為湟源企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

什么是多字段索引?

一般來說,當(dāng)我們需要對數(shù)據(jù)庫中的一張表進(jìn)行復(fù)雜查詢時(shí),比如需要查詢多個字段的值滿足特定條件的記錄,如果使用單字段索引,則需要針對每個字段各創(chuàng)建一個索引,這樣在查詢時(shí)需要對所有索引進(jìn)行遍歷,顯然速度很慢。而多字段索引則是指針對多個字段創(chuàng)建一個索引,比如CREATE INDEX idxname ON tablename (field1, field2, ……, fieldn),這樣只需要對一個索引進(jìn)行遍歷,提高了查詢效率。

多字段索引的使用場景

在什么情況下需要使用多字段索引呢?以下是幾個可能的場景:

1. 復(fù)合查詢:如果查詢需要滿足多個條件,比如SELECT * FROM employees WHERE department=’sales’ AND salary>5000 AND age

2. 順序查詢:如果查詢需要按照某個字段的順序進(jìn)行排序或分組,比如SELECT * FROM employees ORDER BY department, salary,則可以針對department和salary這兩個字段創(chuàng)建一個多字段索引,這樣可以避免對兩個字段分別進(jìn)行排序或分組,提高效率。

3. 子查詢:如果查詢涉及到嵌套子查詢,比如SELECT salesperson, department, sales_amount FROM sales WHERE sales_amount > (SELECT AVG(sales_amount) FROM sales),則可以針對sales_amount這個字段創(chuàng)建一個索引,同時(shí)salesperson和department也可以加入到多字段索引中,這樣可以提高子查詢和連接操作的效率。

4. 類型轉(zhuǎn)換:如果查詢涉及到對字段類型進(jìn)行轉(zhuǎn)換,比如SELECT * FROM orders WHERE DATE_FORMAT(order_date,’%Y-%m-%d’)=’2023-05-01’,則可以創(chuàng)建一個多字段索引,包括order_date和DATE_FORMAT(order_date,’%Y-%m-%d’),這樣可以避免對每個記錄進(jìn)行類型轉(zhuǎn)換。

需要注意的是,在創(chuàng)建多字段索引時(shí),需要根據(jù)實(shí)際使用場景權(quán)衡各個字段的順序,確定多字段索引的順序,這樣可以避免不必要的索引遍歷,影響查詢效率。

多字段索引的優(yōu)點(diǎn)和缺點(diǎn)

與單字段索引相比,多字段索引具有以下優(yōu)點(diǎn):

1. 提高查詢效率:多字段索引可以避免對多個單字段索引進(jìn)行遍歷,從而提高查詢效率。

2. 減少索引數(shù)量:通過使用多字段索引可以減少索引的數(shù)量,避免不必要的維護(hù)和資源占用。

3. 提高空間利用率:多字段索引可以將多個索引合并到一起,提高空間利用率。

不過,多字段索引也有一些缺點(diǎn):

1. 創(chuàng)建和維護(hù)成本高:與單字段索引相比,多字段索引創(chuàng)建和維護(hù)成本更高,需要耗費(fèi)更多的資源和時(shí)間。

2. 可能增加查詢復(fù)雜度:如果多字段索引的順序不當(dāng),可能會增加查詢復(fù)雜度,降低查詢效率。

3. 可能導(dǎo)致磁盤占用增加:多字段索引占用的磁盤空間可能更大,特別是如果需要對多個字段進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換時(shí)。

如何創(chuàng)建多字段索引

創(chuàng)建多字段索引需要注意以下幾點(diǎn):

1. 在確定需要創(chuàng)建多字段索引時(shí),需要先選擇需要建立索引的字段,盡量避免選擇過多的字段。

2. 根據(jù)實(shí)際使用場景選擇合適的字段順序,避免不必要的索引遍歷。

3. 在創(chuàng)建多字段索引時(shí)需要考慮磁盤空間和資源占用的成本,并進(jìn)行必要的優(yōu)化和調(diào)整。

4. 注意維護(hù)索引的一致性和可用性,定期進(jìn)行索引優(yōu)化和重建。

使用多字段索引可以大大提高數(shù)據(jù)庫查詢效率,從而促進(jìn)業(yè)務(wù)運(yùn)營的高效發(fā)展。然而,需要注意的是,在實(shí)際使用過程中,需要綜合考慮多個因素,包括數(shù)據(jù)庫的大小、訪問頻率、查詢條件等,選擇合適的索引類型和數(shù)量。只有在實(shí)際場景中合理使用多字段索引,才能發(fā)揮更大的優(yōu)勢。

相關(guān)問題拓展閱讀:

  • MySQL最多可建立多少索引和索引的限制
  • 在Oracle中合理創(chuàng)建數(shù)據(jù)庫的索引
  • 數(shù)據(jù)庫的索引以及在哪些列上創(chuàng)建索引

MySQL最多可建立多少索引和索引的限制

MySQL

索引

類型包括:

一、普通索引

這是最基本的索引,它沒有任何限制。有以下幾種創(chuàng)建方式:

1.創(chuàng)建索引

代碼如下:

CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR類型,length可以小于字段實(shí)際長度;如果是BLOB和TEXT類型,必須指定 length,下同。

2.修改表結(jié)構(gòu)

代碼如下:

ALTER mytable ADD INDEX ON (username(length)) — 創(chuàng)建表的時(shí)候直接指定。

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

— 刪除索引的語法:

DROP INDEX ON mytable;

二、唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必運(yùn)賣須唯一。它有以下幾種創(chuàng)建方式:

代碼如下:

CREATE UNIQUE INDEX indexName ON mytable(username(length))

— 修旁清逗改表結(jié)構(gòu)

ALTER mytable ADD UNIQUE ON (username(length))

— 創(chuàng)建表的時(shí)候直接指定

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

三、

主鍵

索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時(shí)候同時(shí)創(chuàng)建主鍵索引:

代碼如下:

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

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

四、組合索引

為了形象地對比單列索引和組合索引,為表添加多個字段:

代碼如下:

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

為了進(jìn)一步榨取MySQL的效率,就要考慮建立組合索引。

二:使用索引的注意事項(xiàng)

使用索引時(shí),有以下一些技巧和注意事項(xiàng):

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

只要列中包含有NULL值都將不會被包含在索引中,復(fù)合索引中只要有一列含有NULL值,那么這一列對于此復(fù)合索引就是無效的。所以我們在

數(shù)據(jù)庫設(shè)計(jì)

時(shí)不要讓字段的默認(rèn)值為NULL。

2.使用短索引

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

3.索引列排序

MySQL查詢只使用一個索引,因此如果where子句中已經(jīng)使用了索引的話,那么

order by

中的列是不會使用索引的。因此數(shù)據(jù)庫默認(rèn)排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要更好給這些列創(chuàng)建復(fù)合索引。

4.like語句操作

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

5.不要在列上進(jìn)行運(yùn)算

select * from users where YEAR(adddate)操作。

三:sql優(yōu)化原則

常見的簡化規(guī)則如下:

1.不要有超過5個以上的表連接(JOIN)

2.考慮使用臨時(shí)表或表變量存放中間結(jié)果。

3.少用子查詢

4.視圖嵌套不要過深,一般視圖嵌套不要超過2個為宜。

5.連接的表越多,其編譯的時(shí)間和連接的開銷也越大,性能越不好控制。

6.更好是把連接拆開成較小的幾個部分逐個順序執(zhí)行。

7.優(yōu)先執(zhí)行那些能夠大量減少結(jié)果的連接。

8.拆分的好處不僅僅是減少SQL Server優(yōu)化的時(shí)間,更使得SQL語句能夠以你可以預(yù)測的方式和順序執(zhí)行。

如果一定需要連接很多表才能得到數(shù)據(jù),那么很可能意味著設(shè)計(jì)上的缺陷。

在滿足語句需求的情況下,盡盯巧量少的訪問資源是數(shù)據(jù)庫設(shè)計(jì)的重要原則,這和執(zhí)行的 SQL 有直接的關(guān)系,索引問題又是 SQL 問題中出現(xiàn)頻率更高的,常見的索引問題包括:無索引(失效)、隱式轉(zhuǎn)換。

1. SQL 執(zhí)行流程看一個問題,在下面這個表 T 中,如果我要執(zhí)行 select * from T where k between 3 and 5; 需要執(zhí)行幾次樹的搜索操作,會掃描多少行?mysql> create table T (    -> ID int primary key,    -> k int NOT NULL DEFAULT 0,    -> s varchar(16) NOT NULL DEFAULT ”,    -> index k(k))    -> engine=InnoDB;mysql> insert into T values(100,1, ‘a(chǎn)a’),(200,2,’bb’),\      (300,3,’或慧cc’),(500,5,’ee’),(600,6,’ff’),(700,7,’gg’);

這分別是 ID 字段索引樹、k 字段索引樹。 

這條 SQL 語句的執(zhí)行流程:

1. 在 k 索引樹上找到 k=3,獲得 ID=3002. 回表到 ID 索引樹查找 ID=300 的記錄,對應(yīng) R33. 在 k 索引樹找到下一個值 k=5,ID=5004. 再回到 ID 索引樹找到對應(yīng) ID=500 的 R4

5. 在 k 索引樹去下一個值 k=6,不符合條件,循環(huán)結(jié)束

這個過程讀取了 k 索引樹的三條記錄,回表了兩次。因?yàn)椴樵兘Y(jié)果所需要的數(shù)據(jù)只在主鍵索引上有,所以必須得回表。所以,我們該如何通過優(yōu)化索引,來避免回表呢?

2. 常見索引優(yōu)化2.1 覆蓋索引覆蓋索引,換言之就是索引要覆蓋我們的查詢請求,無需回表。

如果執(zhí)行的語句是 select ID from T wherek between 3 and 5;,這樣的話因?yàn)?ID 的值在 k 索引樹上,就不需要回表了。

覆蓋索引可以減少樹的搜索次數(shù),顯著提升查詢性能,是常用的性能優(yōu)化手衫則答段。

但是,維護(hù)索引是有代價(jià)的,所以在建立冗余索引來支持覆蓋索引時(shí)要權(quán)衡利弊。

2.2 最左前綴原則

B+ 樹的數(shù)據(jù)項(xiàng)是復(fù)合的數(shù)據(jù)結(jié)構(gòu),比如 (name,sex,age) 的時(shí)候,B+ 樹是按照從左到右的順序來建立搜索樹的,當(dāng) (張三,F,26) 這樣的數(shù)據(jù)來檢索的時(shí)候,B+ 樹會優(yōu)先比較 name 來確定下一步的檢索方向,如果 name 相同再依次比較 sex 和 age,最后得到檢索的數(shù)據(jù)。

# 有這樣一個表 P

mysql> create table P (id int primary key, name varchar(10) not null, sex varchar(1), age int, index tl(name,sex,age)) engine=IInnoDB;

mysql> insert into P values(1,’張三’,’F’,26),(2,’張三’,’M’,27),(3,’李四’,’F’,28),(4,’烏茲’,’F’,22),(5,’張三’,’M’,21),(6,’王五’,’M’,28);

# 下面的語句結(jié)果相同

mysql> select * from P where name=’張三’ and sex=’F’;     ## A1

mysql> select * from P where sex=’F’ and age=26;## A2

# explain 看一下

mysql> explain select * from P where name=’張三’ and sex=’F’;

+—-++++——+-+——+++——+++

| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref| rows | filtered | Extra|

+—-++++——+-+——+++——+++

|  1 | SIMPLE      | P     | NULL| ref  | tl| tl   || const,const |    1 |   100.00 | Using index |

+—-++++——+-+——+++——+++

mysql> explain select * from P where sex=’F’ and age=26;

+—-+++++-+——++——+——+++

| id | select_type | table | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra      |

+—-+++++-+——++——+——+++

|  1 | SIMPLE      | P     | NULL| index | NULL| tl   || NULL |    6 |    16.67 | Using where; Using index |

+—-+++++-+——++——+——+++

可以清楚的看到,A1 使用 tl 索引,A2 進(jìn)行了全表掃描,雖然 A2 的兩個條件都在 tl 索引中出現(xiàn),但是沒有使用到 name 列,不符合最左前綴原則,無法使用索引。所以在建立聯(lián)合索引的時(shí)候,如何安排索引內(nèi)的字段排序是關(guān)鍵。評估標(biāo)準(zhǔn)是索引的復(fù)用能力,因?yàn)橹С肿钭笄熬Y,所以當(dāng)建立(a,b)這個聯(lián)合索引之后,就不需要給 a 單獨(dú)建立索引。原則上,如果通過調(diào)整順序,可以少維護(hù)一個索引,那么這個順序往往就是需要優(yōu)先考慮采用的。上面這個例子中,如果查詢條件里只有 b,就是沒法利用(a,b)這個聯(lián)合索引的,這時(shí)候就不得不維護(hù)另一個索引,也就是說要同時(shí)維護(hù)(a,b)、(b)兩個索引。這樣的話,就需要考慮空間占用了,比如,name 和 age 的聯(lián)合索引,name 字段比 age 字段占用空間大,所以創(chuàng)建(name,age)聯(lián)合索引和(age)索引占用空間是要小于(age,name)、(name)索引的。

2.3 索引下推

以人員表的聯(lián)合索引(name, age)為例。如果現(xiàn)在有一個需求:檢索出表中“名字之一個字是張,而且年齡是26歲的所有男性”。那么,SQL 語句是這么寫的mysql> select * from tuser where name like ‘張%’ and age=26 and sex=M;

通過最左前綴索引規(guī)則,會找到 ID1,然后需要判斷其他條件是否滿足在 MySQL 5.6 之前,只能從 ID1 開始一個個回表。到主鍵索引上找出數(shù)據(jù)行,再對比字段值。而 MySQL 5.6 引入的索引下推優(yōu)化(index condition pushdown),可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數(shù)。這樣,減少了回表次數(shù)和之后再次過濾的工作量,明顯提高檢索速度。

2.4 隱式類型轉(zhuǎn)化

隱式類型轉(zhuǎn)化主要原因是,表結(jié)構(gòu)中指定的數(shù)據(jù)類型與傳入的數(shù)據(jù)類型不同,導(dǎo)致索引無法使用。所以有兩種方案:

修改表結(jié)構(gòu),修改字段數(shù)據(jù)類型。

修改應(yīng)用,將應(yīng)用中傳入的字符類型改為與表結(jié)構(gòu)相同類型。

3. 為什么會選錯索引3.1 優(yōu)化器選擇索引是優(yōu)化器的工作,其目的是找到一個更優(yōu)的執(zhí)行方案,用最小的代價(jià)去執(zhí)行語句。在數(shù)據(jù)庫中,掃描行數(shù)是影響執(zhí)行代價(jià)的因素之一。掃描的行數(shù)越少,意味著訪問磁盤數(shù)據(jù)的次數(shù)越少,消耗的 CPU 資源越少。當(dāng)然,掃描行數(shù)并不是唯一的判斷標(biāo)準(zhǔn),優(yōu)化器還會結(jié)合是否使用臨時(shí)表、是否排序等因素進(jìn)行綜合判斷。

3.2 掃描行數(shù)

MySQL 在真正開始執(zhí)行語句之前,并不能精確的知道滿足這個條件的記錄有多少條,只能通過索引的區(qū)分度來判斷。顯然,一個索引上不同的值越多,索引的區(qū)分度就越好,而一個索引上不同值的個數(shù)我們稱為“基數(shù)”,也就是說,這個基數(shù)越大,索引的區(qū)分度越好。# 通過 show index 方法,查看索引的基數(shù)mysql> show index from t;++++++++++——+++-+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |++++++++++——+++-+| t     || PRIMARY  || id| A||     NULL | NULL   |      | REE      || || t     || a|| a| A||     NULL | NULL   | YES  | REE      || || t     || b|| b| A||     NULL | NULL   | YES  | REE      || |++++++++++——+++-+

MySQL 使用采樣統(tǒng)計(jì)方法來估算基數(shù):采樣統(tǒng)計(jì)的時(shí)候,InnoDB 默認(rèn)會選擇 N 個數(shù)據(jù)頁,統(tǒng)計(jì)這些頁面上的不同值,得到一個平均值,然后乘以這個索引的頁面數(shù),就得到了這個索引的基數(shù)。而數(shù)據(jù)表是會持續(xù)更新的,索引統(tǒng)計(jì)信息也不會固定不變。所以,當(dāng)變更的數(shù)據(jù)行數(shù)超過 1/M 的時(shí)候,會自動觸發(fā)重新做一次索引統(tǒng)計(jì)。

在 MySQL 中,有兩種存儲索引統(tǒng)計(jì)的方式,可以通過設(shè)置參數(shù) innodb_stats_persistent 的值來選擇:

on 表示統(tǒng)計(jì)信息會持久化存儲。默認(rèn) N = 20,M = 10。

off 表示統(tǒng)計(jì)信息只存儲在內(nèi)存中。默認(rèn) N = 8,M = 16。

由于是采樣統(tǒng)計(jì),所以不管 N 是 20 還是 8,這個基數(shù)都很容易不準(zhǔn)確。所以,冤有頭債有主,MySQL 選錯索引,還得歸咎到?jīng)]能準(zhǔn)確地判斷出掃描行數(shù)。

可以用 yze table 來重新統(tǒng)計(jì)索引信息,進(jìn)行修正。

ANAZE TABLE tbl_name …

在Oracle中合理創(chuàng)建數(shù)據(jù)庫的索引

在Oracle數(shù)據(jù)庫中 創(chuàng)建索引雖然比較簡單 但是要合理的創(chuàng)建索引則比較困慧塌難了 筆者認(rèn)為 在創(chuàng)建索引時(shí)要做到三個適當(dāng) 即在適當(dāng)?shù)谋砩?適當(dāng)?shù)牧猩蟿?chuàng)建適當(dāng)數(shù)量的索引 雖然這可以通過一句話來概括優(yōu)化的索引的基本準(zhǔn)則 但是要做到這一點(diǎn)的話 需要數(shù)據(jù)庫管理員做出很大的努力 具體的來說 要做到這個三個適當(dāng)有如下幾個要求

  

一 根據(jù)表的大小來創(chuàng)建索引

  雖然給表創(chuàng)建索引 可以提高查詢的效率 但是數(shù)據(jù)庫管理員需要注意的是 索引也需要一定的開銷的 為此并不是說給所有的表都創(chuàng)建索引 那么就可以提高數(shù)據(jù)庫的性能 這個認(rèn)識是錯誤的 恰恰相反 如果不管三七二十一 給所有的表都創(chuàng)建了索引 那么其反而會給數(shù)據(jù)庫的性能造成負(fù)面的影響 因?yàn)榇藭r(shí)濫用索引的開銷可能已經(jīng)遠(yuǎn)遠(yuǎn)大于由此帶來的性能方面的收益 所以筆者認(rèn)為 數(shù)據(jù)庫管理員首先需要做到 為合適的表來建立索引 而不是為所有的表建立索引

  一般來說 不需要為比較小的表創(chuàng)建索引 如在一個ERP系統(tǒng)的數(shù)據(jù)庫中 department表用來存儲企業(yè)部門的信息 一般企業(yè)的部分也就十幾個 最多不會超過一百個 這 條記錄對于人來說 可能算是比較多了 但是對于計(jì)算機(jī)來說 這給他塞塞牙縫都還不夠 所以 對類似的小表沒有必要建立索引 因?yàn)榧词菇⒘怂饕?其性能也不會得到很大的改善 相反索引建立的開銷 如維護(hù)成本等等 要比這個要大 也就是說 付出的要比得到的多 顯然違反常理

  另外 就是對于超大的表 也不一定要建立索引 有些表雖然比較大 記錄數(shù)量非常的多 但是此時(shí)為這個表建立索引并一定的合適 如系統(tǒng)中有一張表 其主要用來保存數(shù)據(jù)庫中的一些變更信息 往往這些信息只給數(shù)據(jù)庫管理員使用 此時(shí)為這張表建立索引的話 反而不合適 因?yàn)檫@張表很少用到 只有在出問題的時(shí)候才需要查看 其次其即使查看 需要查詢的紀(jì)錄也不會很多 可能就是最近一周的更新記錄等等 對于對于一些超大的表 建立索引有時(shí)候往往不能夠達(dá)到預(yù)計(jì)的效果 而且在打表上建立索引 其索引的開銷要比普通的表大的多 那么到底是否給大表建立索引呢?筆者認(rèn)為 主要是看兩個方面的內(nèi)容 首前中圓先是需要關(guān)注一下 在這張大表中經(jīng)常需要查詢的記錄數(shù)量 一般來說 如果經(jīng)常需要查詢的數(shù)據(jù)不超過 %到 %的話 那就沒有必要為其建立索引的必要 因?yàn)榇藭r(shí)建立索引的開銷可能要比性能的改善大的多 這個比例只是一個經(jīng)驗(yàn)的數(shù)據(jù) 如果數(shù)據(jù)庫管理員需要得出一個比較精確的結(jié)論 那么就需要進(jìn)行測試分析 即數(shù)據(jù)庫管理員需要測試一下全表掃描的時(shí)間 看看其是否比建立索引后的查詢時(shí)間要長或者短 如果是長的話 則說明有建立索引的必要 但是如果沒有的話 則說明還是全表掃描速度來的快 此時(shí)也就沒有必要建立索引了

  總之 在考慮是否該為表建立索引時(shí) 一般來說小表沒有建立索引的必要 而對于打表的話 則需要進(jìn)行實(shí)際情況實(shí)際分析 簡單一點(diǎn)的 可以根據(jù)大致的比率來確定 如果要精確一點(diǎn)的 則可以進(jìn)行全表掃描性能分析 以判斷建立索引后是否真的如預(yù)期那樣改善了數(shù)據(jù)庫性能

  

二 根據(jù)列的特征來創(chuàng)建索引

  列的特點(diǎn)不同 索引創(chuàng)建的效果也不同 數(shù)據(jù)庫管理員需要了解為哪些列創(chuàng)建索引可以起到事倍功半的效果 同時(shí)也需要了解為哪些列創(chuàng)建索引反而起到的是事倍功半的效果 這有利于他們了解到底給為怎么樣的字段建立索引

  根據(jù)筆者的經(jīng)驗(yàn) 往往為如下特征的列創(chuàng)建索引能夠起到比較明顯的效果 如對于一些重復(fù)內(nèi)容比較少的列 特別是對于那些定義了唯一約束的列 在這些列上建立索引 往往可以起到非常不錯的效果 如對于一些null值的列與非Null值的列培敏混合情況下 如果用戶需要經(jīng)常查詢所有的非Null值記錄的列 則更好為其設(shè)置索引 如果經(jīng)常需要多表連接查詢 在用與連接的列上設(shè)置索引可以達(dá)到事半功倍的效果

  可見 索引設(shè)置的是否恰當(dāng) 不僅跟數(shù)據(jù)庫設(shè)計(jì)架構(gòu)有關(guān) 而且還跟企業(yè)的經(jīng)濟(jì)業(yè)務(wù)相關(guān) 為此 對于一些套裝軟件 雖然一開始數(shù)據(jù)庫管理員已經(jīng)做了索引的優(yōu)化工作 但是隨著后來經(jīng)濟(jì)數(shù)據(jù)的增加 這個索引的效果會越來越打折扣 這主要是因?yàn)橛涗浀谋砘绊懙搅怂饕齼?yōu)化的效果 所以筆者建議各位數(shù)據(jù)庫管理員 即使采用的是大牌軟件公司的套裝軟件 也需要隔一段時(shí)間 如一年 對數(shù)據(jù)庫的索引進(jìn)行優(yōu)化 該去掉的去掉 該調(diào)整的調(diào)整 以提高數(shù)據(jù)庫的性能

  如在數(shù)據(jù)庫中有一張表是用來保存用戶信息的 其中有個字段身份證號碼 這是一個唯一的字段 在數(shù)據(jù)庫設(shè)計(jì)時(shí) 給這個字段創(chuàng)建了索引 但是當(dāng)這個數(shù)據(jù)庫投入使用之后 用戶不怎么輸入用戶的身份證號碼 而且平時(shí)也基本不按這個號碼來進(jìn)行查詢 當(dāng)記錄月來月多時(shí) 這個身份證號碼上的索引字段不但不能夠改善數(shù)據(jù)庫的查詢性能 反而成了雞肋 對于這些有很多NULL值的列 而且不會經(jīng)常查詢所有的非NULL值記錄的列 數(shù)據(jù)庫管理員要下決心 即使清除這些列上的索引

  所以說索引的優(yōu)化與調(diào)整是一個動態(tài)的過程 并不是說數(shù)據(jù)庫設(shè)計(jì)好之后就不需要經(jīng)過調(diào)整 數(shù)據(jù)庫管理員往往需要根據(jù)記錄的變化情況 來進(jìn)行適當(dāng)?shù)淖兏?以提高索引的效果

  

三 在一個表上創(chuàng)建多少索引合適?

  雖然說 在表上創(chuàng)建索引的數(shù)量沒有限制 但是決不是越多越好 也就是說 在創(chuàng)建索引這項(xiàng)事情上 + 〉 往往不成立 有時(shí)候 創(chuàng)建索引越多 其可能會得到適得其反的效果 那么在一個表上 到底給創(chuàng)建多少索引合適呢?這個沒有一個明確的標(biāo)準(zhǔn) 而是需要數(shù)據(jù)庫管理員根據(jù)實(shí)際的用途以及數(shù)據(jù)庫中記錄的情況 來進(jìn)行判斷

  通常來說 表的索引越多 其查詢的速度也就越快 但是 表的更新速度則會降低 這主要是因?yàn)楸淼母?如往表中插入一條記錄)速度 反而隨著索引的增加而增加 這主要是因?yàn)?在更新記錄的同時(shí)需要更新相關(guān)的索引信息 為此 到底在表中創(chuàng)建多少索引合適 就需要在這個更新速度與查詢速度之間取得一個均衡點(diǎn) 如對于一些數(shù)據(jù)倉庫或者決策型數(shù)據(jù)庫系統(tǒng) 其主要用來進(jìn)行查詢 相關(guān)的記錄往往是在數(shù)據(jù)庫初始化的時(shí)候倒入 此時(shí) 設(shè)置的索引多一點(diǎn) 可以提高數(shù)據(jù)庫的查詢性能 同時(shí)因?yàn)橛涗洸辉趺锤?所以索引比較多的情況下 也不會影響到更新的速度 即使在起初的時(shí)候需要導(dǎo)入大量的數(shù)據(jù) 此時(shí)也可以先將索引禁用掉 等到數(shù)據(jù)導(dǎo)入完畢后 再啟用索引 可以通過這種方式來減少索引對數(shù)據(jù)更新的影響 相反 如果那些表中經(jīng)常需要更新記錄 如一些事務(wù)型的應(yīng)用系統(tǒng) 數(shù)據(jù)更新操作是家常便飯的事情 此時(shí)如果在一張表中建立過多的索引 則會影響到更新的速度 由于更新操作比較頻繁 所以對其的負(fù)面影響 要比查詢效率提升要大的多 此時(shí)就需要限制索引的數(shù)量 只在一些必要的字段上建立索引

  筆者在平時(shí)數(shù)據(jù)庫優(yōu)化時(shí) 往往會根據(jù)這些表的用途來為列設(shè)置索引 可以查詢相關(guān)的動態(tài)視圖 看看對于這張表的操作 是更新操作(包括更新 刪除 插入等等)占的比例大 還是查詢操作占的比例大 當(dāng)過多的索引已經(jīng)影響到更新操作的速度時(shí) 則數(shù)據(jù)庫管理員就需要先禁用某些索引 以提高數(shù)據(jù)庫的性能

lishixinzhi/Article/program/Oracle/202311/18407

數(shù)據(jù)庫的索引以及在哪些列上創(chuàng)建索引

選擇開始菜單中→程序→【management

sql

server

2023】→【sql

server

management

studio】命令,打開【sql

server

management

studio】窗口,并使用windows或

sql

server身份驗(yàn)證建立連接。

在【對象資源管理器】窗口中展開服務(wù)器,然后選擇【數(shù)據(jù)庫】節(jié)點(diǎn)

右鍵單擊【數(shù)據(jù)庫】節(jié)點(diǎn),從彈出來的快捷菜單中選擇【新建數(shù)據(jù)庫】命令。

執(zhí)行上述操作后,會彈出【新察畢此建數(shù)據(jù)庫】對話框。在對話框、左側(cè)有3個選項(xiàng),分別是【常規(guī)】、【選項(xiàng)】和【文件組】。完成這三個選項(xiàng)中的設(shè)置會后,就完成了數(shù)據(jù)庫的創(chuàng)建工作,

在【數(shù)據(jù)庫名稱】文本框中數(shù)閉輸入要新建數(shù)據(jù)庫的名稱。例如,這里以“新建的數(shù)據(jù)庫”。

在【所有者】文本框中輸入新敗迅建數(shù)據(jù)庫的所有者,如sa。根據(jù)數(shù)據(jù)庫的使用情況,選擇啟用或者禁用【使用全文索引】復(fù)選框。

在【數(shù)據(jù)庫文件】列表中包括兩行,一行是數(shù)據(jù)庫文件,而另一行是日記文件。通過單擊下面的【添加】、【刪除】按鈕添加或刪除數(shù)據(jù)庫文件。

切換到【選項(xiàng)頁】、在這里可以設(shè)置數(shù)據(jù)庫的排序規(guī)則、恢復(fù)模式、兼容級別和其他屬性。

切換到【文件組】頁,在這里可以添加或刪除文件組。

完成以上操作后,單擊【確定】按鈕關(guān)閉【新建數(shù)據(jù)庫】對話框。至此“新建的數(shù)據(jù)”數(shù)據(jù)庫創(chuàng)建成功。新建的數(shù)據(jù)庫可以再【對象資源管理器】窗口看到。

數(shù)據(jù)庫創(chuàng)建多字段索引的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于數(shù)據(jù)庫創(chuàng)建多字段索引,提高數(shù)據(jù)庫查詢效率的方法:創(chuàng)建多字段索引,MySQL最多可建立多少索引和索引的限制,在Oracle中合理創(chuàng)建數(shù)據(jù)庫的索引,數(shù)據(jù)庫的索引以及在哪些列上創(chuàng)建索引的信息別忘了在本站進(jìn)行查找喔。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


當(dāng)前題目:提高數(shù)據(jù)庫查詢效率的方法:創(chuàng)建多字段索引(數(shù)據(jù)庫創(chuàng)建多字段索引)
轉(zhuǎn)載注明:http://www.5511xx.com/article/coddojc.html