国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MYSQL之索引語(yǔ)法與使用

這篇具有很好參考價(jià)值的文章主要介紹了MYSQL之索引語(yǔ)法與使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

索引分類(lèi)

分類(lèi)?????????????? 含義???????????????????????????????????????????????????? 特點(diǎn)???????????????????????????????????????? 關(guān)鍵字

主鍵索引??? 針對(duì)表中主鍵創(chuàng)建的索引??????????????????? 默認(rèn)自動(dòng)創(chuàng)建,只能有一個(gè)????????? PRIMARY

唯一索引??? 避免同一個(gè)表中某數(shù)據(jù)列中的值重復(fù)? 可以有多個(gè)???????????????????????????????? ? UNIQUE

常規(guī)索引??? 快速定位特定數(shù)據(jù)??????? ???????????????????? ? 可以有多個(gè)????????

全文索引??? 全文索引查找的是文本中的關(guān)鍵詞 ? ?? 可以有多個(gè) ????????????????????????????????? FULLTEXT

在InnoDB存儲(chǔ)引擎中,根據(jù)索引的存儲(chǔ)形式,又可分為以下兩種:

分類(lèi)??????????????? 含義??????????????? 特點(diǎn)????????????

聚焦索引??? 將數(shù)據(jù)存儲(chǔ)與索引放到了一塊,索引結(jié)構(gòu)的葉子節(jié)點(diǎn)保存了行數(shù)據(jù)??? 有且僅能有一個(gè)

二級(jí)索引? ? 將數(shù)據(jù)與索引分開(kāi)存儲(chǔ),索引結(jié)構(gòu)的葉子節(jié)點(diǎn)關(guān)聯(lián)的是對(duì)應(yīng)的主鍵??? 可以存在多個(gè)

聚焦索引選取規(guī)則

1、如果存在主鍵,主鍵索引就是聚焦索引

2、如果不存在主鍵,將使用第一個(gè)唯一索引作為聚焦索引

3、如果表沒(méi)有主鍵,或沒(méi)有合適的唯一索引,則InnoDB會(huì)自動(dòng)生成一個(gè)rowid作為隱藏的聚焦索引

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

select * form user where name=“Arm”;

利用二級(jí)索引找到對(duì)應(yīng)聚焦索引(回表查詢(xún))然后找到對(duì)應(yīng)數(shù)據(jù)

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

思考:

1、以下SQL語(yǔ)句,哪個(gè)執(zhí)行效率高?為什么?

select * from user where id =10;

select * from user where name =‘a(chǎn)rm’;

備注:id為主鍵,name字段創(chuàng)建的有索引

答:第一個(gè)語(yǔ)句執(zhí)行效率高,因?yàn)閳?zhí)行第二個(gè)語(yǔ)句name字段是二級(jí)索引,還需要回表檢索到聚焦索引,才能找到對(duì)應(yīng)的數(shù)據(jù)。

2、InnoDB主鍵索引的B+Tree高度有多高?

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

假設(shè):

一行數(shù)據(jù)的大小為1KB,一頁(yè)(16K)中可以存儲(chǔ)16行這樣的數(shù)據(jù)。InnoDB的指針占用6個(gè)字節(jié)的空間,主鍵即使是bigint,占用的字節(jié)數(shù)為8。

樹(shù)的高度為2可以存儲(chǔ)的:

n*8+(n+1)*6=1024*16

主鍵:n = 1170

指針:n+1=1171

存儲(chǔ)量(KB)1171*16=18736KB

樹(shù)的高度為3可以存儲(chǔ):

1171*1171*16=21939856KB=21426MB=21GB

索引語(yǔ)法

創(chuàng)建索引

語(yǔ)法:

CREATE [UNIQUE|FULLTEXT]INDEX 索引名 ON 表名(被索引列名...);

案例

1、name字段為姓名字段,該字段的值可能會(huì)重復(fù),為該字段創(chuàng)建索引

CREATE INDEX ON user1(name1);

2、phone手機(jī)號(hào)字段的值,是非空,且唯一,為該字段創(chuàng)建唯一索引

CREATE UNIQUE INDEX index_to_phone ON user1(phone);

3、為profession、age、status創(chuàng)建聯(lián)合索引

CREATE INDEX idx_user_pro_age_sta  ON user1(profession,age,status);

4、為Email建立合適的索引來(lái)提升查詢(xún)的效率

CREATE INDEX index_user_email ON user1(email);

查看索引

查看當(dāng)前表所具有的索引:

show index from 表名;

刪除索引

刪除索引:

DROP INDEX 索引名 ON 表名;

SQL性能分析

1、SQL執(zhí)行頻率

MYSQL客戶(hù)端連接成功后,通過(guò)show[session|global]status命令可以提供服務(wù)器狀態(tài)信息。

通過(guò)如下指令可以查看當(dāng)前數(shù)據(jù)庫(kù)的insert,update,delete,select的訪(fǎng)問(wèn)頻次:

SHOW GLOBAL STATUS LIKE 'Com_______';

2、慢查詢(xún)?nèi)罩?/h4>

慢查詢(xún)?nèi)罩居涗浰袌?zhí)行時(shí)間超過(guò)指定參數(shù)(long_query_time,單位:秒,默認(rèn)10秒)的所有SQL語(yǔ)句的日志。MYSQL的慢查詢(xún)?nèi)罩灸J(rèn)并沒(méi)有開(kāi)啟,需要在MYSQL的配置文件:

C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

找到指定文件內(nèi),修改圖下信息:

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

配置完成之后,通過(guò)以下指令重啟MYSQL服務(wù)器進(jìn)行測(cè)試,查看慢日志文件中記錄的信息:C:\ProgramData\MySQL\MySQL Server 8.0\Data\**-slow.log

3、profiles詳情

show profiles能夠在做SQL優(yōu)化時(shí)幫助我們了解時(shí)間都耗費(fèi)到哪里去了。通過(guò)have_profiling參數(shù),能夠看到是否支持profiles,yes是支持。

select @@have_profiling;

默認(rèn)profiling默認(rèn)是關(guān)閉的,通過(guò)set語(yǔ)句在session/global級(jí)別開(kāi)啟profiling

查詢(xún)是否開(kāi)啟:select

0關(guān)閉1開(kāi)啟

設(shè)置開(kāi)啟

set @@profiling=1;

然后執(zhí)行一系列sql語(yǔ)句之后

通過(guò)

show profiles;

查看各個(gè)sql語(yǔ)句的耗時(shí)。

查詢(xún)SQL語(yǔ)句在各個(gè)階段執(zhí)行耗時(shí)情況

show profiles for query query_id;

查詢(xún)指定query_id的SQL語(yǔ)句CPU的使用情況

show profiles cpu for query query_id;

4、explain執(zhí)行計(jì)劃

explain執(zhí)行計(jì)劃各字段的含義:

explain sql語(yǔ)句

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

索引的使用

驗(yàn)證索引效率

在未創(chuàng)建索引之前,執(zhí)行SQL語(yǔ)句查看SQL的耗時(shí)

select * from tb_sku where sn ='10000002258';

耗時(shí)20.03s

針對(duì)字段創(chuàng)建索引

create index idx_sku_sn on tb_sku(sn);

然后再次執(zhí)行相同的SQL語(yǔ)句,再次查看SQL的耗時(shí)情況。

select * from tb_sku where sn ='10000002258';

耗時(shí)0.00s

使用原則

索引失效
最左前綴法則

如果索引了多列(聯(lián)合索引),要遵守最左前綴法則指的是查詢(xún)從索引的最左列開(kāi)始,并且不跳過(guò)索引中的列。如果跳過(guò)某一列,索引將部分失效(后面的字段索引失效)。

create full_text index idx_pro_age_sta on tb_user(profession,age,status);
# 走索引
explain select * from tb_user where profession="軟件工程" and age=31 and status="0";
# 走索引
explain select * from tb_user where profession="軟件工程" and age=31;
# 走索引
explain select * from tb_user where profession="軟件工程";
# 走索引 status失效
explain select * from tb_user where profession="軟件工程" and status="0";
# 不走索引
explain select * from tb_user where age=31 and status="0";
# 不走索引
explain select * from tb_user where status="0";
范圍查詢(xún)

聯(lián)合索引中,出現(xiàn)范圍查詢(xún)(>,<),范圍查詢(xún)右側(cè)的列索引失效(規(guī)避辦法加上>=)

# age后索引失效
explain select * from tb_user where profession="軟甲工程" and age>60 and status='0';
# 規(guī)避辦法
explain select * from tb_user where profession="軟甲工程" and age>=60 and status='0';
索引列運(yùn)算操作

不要在索引列進(jìn)行運(yùn)算操作,索引將失效

explain select * from tb_user where substring(phone,10,2)='15';
字符串類(lèi)型不加引號(hào)

字符串類(lèi)型的字段使用時(shí),不加引號(hào),索引將失效

explain select * from tb_user where profession="軟甲工程" and age>=60 and status='0';
# status索引失效
explain select * from tb_user where profession="軟甲工程" and age>=60 and status=0;
模糊查詢(xún)

如果僅僅是尾部模糊匹配,索引不會(huì)失效,如果是頭部模糊匹配,索引失效。

# 走索引
explain select * from tb_user where profession="軟甲工程";
# 走索引
explain select * from tb_user where profession like "軟甲%" ;
# 不走索引
explain select * from tb_user where profession like "%工程";
or連接的條件

用or分隔開(kāi)的條件,如果or前的條件中的列有索引,而后面的列中沒(méi)有索引,那么涉及的索引豆瓣不會(huì)被用到。

解決辦法:針對(duì)or條件后的字段建立索引

數(shù)據(jù)分布影響

如果MYSQL評(píng)估使用索引比全表更慢,則不使用索引

# 數(shù)據(jù)總量 190000000-1900000020
# 走全表掃描
select * from tb_user where phone>='190000005'
# 走索引
select * from tb_user where phone>='190000015'
SQL提示

SQL提示,是優(yōu)化數(shù)據(jù)庫(kù)的一個(gè)重要手段,簡(jiǎn)單來(lái)說(shuō),就是在SQL語(yǔ)句中加入一些人為的提示來(lái)達(dá)到優(yōu)化操作的目的。

use index(給個(gè)建議)

explain select * from tb_user use index(idx_user_pro) where profession="軟件工程";
 

ignore index(忽略)

explain select * from tb_user ignore index(idx_user_pro) where profession="軟件工程";
 

force index(強(qiáng)制)

explain select * from tb_user force index(idx_user_pro) where profession="軟件工程";
 
覆蓋索引

覆蓋索引:指的是查詢(xún)字段在索引中全部能找到。

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

盡量使用覆蓋索引(查詢(xún)使用了索引,并且要返回的列能在該索引中全部找到),減少select*(要回表查詢(xún),使性能下降)

注意:

using index condition:查找使用了索引,但需要回表查詢(xún)數(shù)據(jù)

usingwhere;using index:查找使用了索引,但需要的數(shù)據(jù)在索引列能找到,不需要回表查詢(xún)

思考題:

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

建立一個(gè)包含 username和password的聯(lián)合索引

前綴索引

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

當(dāng)字段類(lèi)型為字符串(varchar、text等)時(shí),有時(shí)候需要索引很長(zhǎng)的字符串,這會(huì)讓索引變得很大,查詢(xún)時(shí)浪費(fèi)很大的磁盤(pán)IO空間,影響查詢(xún)效率。此時(shí)可以只將字符串的一部分前綴,建立索引,這樣可以大大節(jié)約索引空間,從而提高索引效率。

創(chuàng)建語(yǔ)法
create index 索引名 on 表名(列名(選取長(zhǎng)度n));
前綴長(zhǎng)度計(jì)算

根據(jù)索引的選擇性來(lái)決定,選擇性指的是不重復(fù)的索引值和數(shù)據(jù)表中的記錄總數(shù)的比值,索引選擇性越高查詢(xún)效率越高,唯一索引的選擇性是1

select count(distinct email)/count(*)/ from tb_user;

select count(distinct substring(email,1,5))/count(*) from tb_user;
單列索引和聯(lián)合索引

單列索引:一個(gè)索引包含一個(gè)列

聯(lián)合索引:一個(gè)索引包含多個(gè)列

在業(yè)務(wù)場(chǎng)景中,如果存在多個(gè)查詢(xún)條件,考慮針對(duì)查詢(xún)字段建立索引時(shí),建立聯(lián)合索引,而非單列索引。

單列索引可能會(huì)回表查詢(xún)

聯(lián)合索引情況

MYSQL之索引語(yǔ)法與使用,mysql,數(shù)據(jù)庫(kù)

設(shè)計(jì)原則

1、針對(duì)數(shù)據(jù)量較大,且查詢(xún)較頻繁的表建立索引。

2、針對(duì)于常作為查詢(xún)條件、排序條件、分組操作的字段建立索引。

3、盡量選擇分區(qū)度高的列作為索引,盡量建立唯一索引,區(qū)分度越高、使用索引的效率越高。

4、如果字符串類(lèi)型是字段,字段的長(zhǎng)度較長(zhǎng),可以根據(jù)字段特點(diǎn)建立前綴索引。

5、盡量使用聯(lián)合索引、減少使用單列索引,查詢(xún)時(shí),聯(lián)合索引很多時(shí)候可以覆蓋索引,節(jié)省存儲(chǔ)空間,避免回表,提高查詢(xún)效率。

6、要控制索引的數(shù)量,索引并不是多多益善,索引越多,維護(hù)索引結(jié)構(gòu)的代價(jià)也就越大,會(huì)影響增刪改的效率。

7、如果索引列不能存儲(chǔ)NULL值,請(qǐng)?jiān)趧?chuàng)建表時(shí)使用NOT NULL約束它,當(dāng)優(yōu)化器知道每列是否包含NULL值時(shí),它可以更好的確定哪個(gè)索引最有效的用于查詢(xún)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-817419.html

到了這里,關(guān)于MYSQL之索引語(yǔ)法與使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MySQL數(shù)據(jù)庫(kù)索引機(jī)制

    MySQL數(shù)據(jù)庫(kù)索引機(jī)制

    MySQL是一款有客戶(hù)端和服務(wù)端的網(wǎng)絡(luò)應(yīng)用,mysql是它的客戶(hù)端,mysqld是它的服務(wù)端。服務(wù)端本質(zhì)就是一個(gè)進(jìn)程,它存在于內(nèi)存當(dāng)中。而我們存儲(chǔ)在MySQL中的數(shù)據(jù)是保存在磁盤(pán)上的,當(dāng)我們對(duì)MySQL中數(shù)據(jù)進(jìn)行增刪查改操作時(shí),不可能是直接在磁盤(pán)上進(jìn)行操作,而是將對(duì)應(yīng)的數(shù)據(jù)加

    2024年02月12日
    瀏覽(100)
  • MySQL數(shù)據(jù)庫(kù)唯一索引

    MySQL數(shù)據(jù)庫(kù)唯一索引

    創(chuàng)建索引是指在某個(gè)表的一列或多列上建立一個(gè)索引,以便提高對(duì)表的訪(fǎng)問(wèn)速度。創(chuàng)建索引有3種方式,分別是1.創(chuàng)建表的時(shí)候創(chuàng)建索引、2.在已經(jīng)存在的表上創(chuàng)建索引和使用3.ALTER TABLE語(yǔ)句來(lái)創(chuàng)建索引。 本文福利, 莬 費(fèi)領(lǐng)取Qt開(kāi)發(fā)學(xué)習(xí)資料包、技術(shù)視頻,內(nèi)容包括(C++語(yǔ)言基

    2024年02月08日
    瀏覽(96)
  • 簡(jiǎn)單認(rèn)識(shí)MySQL數(shù)據(jù)庫(kù)索引

    簡(jiǎn)單認(rèn)識(shí)MySQL數(shù)據(jù)庫(kù)索引

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 ●索引是一個(gè)排序的列表,在這個(gè)列表中存儲(chǔ)著索引的值和包含這個(gè)值的數(shù)據(jù)所在行的物理地址(類(lèi)似于C語(yǔ)言的鏈表通過(guò)指針指向數(shù)據(jù)記錄的內(nèi)存地址)。 ●使用索引后可以不用掃描全表來(lái)定位某行的

    2024年02月16日
    瀏覽(31)
  • MySQL數(shù)據(jù)庫(kù)索引的數(shù)據(jù)結(jié)構(gòu)

    數(shù)據(jù)庫(kù)索引的功能就是讓查找更加的高效,所以索引的數(shù)據(jù)結(jié)構(gòu)應(yīng)該是能夠加速查找的數(shù)據(jù)結(jié)構(gòu)。 MySQL的innoDB存儲(chǔ)引擎的索引的數(shù)據(jù)結(jié)構(gòu)就是多叉搜索樹(shù)中的b+樹(shù),這可以說(shuō)是為索引量身定做的一個(gè)數(shù)據(jù)結(jié)構(gòu)。 首先,索引可以通過(guò)主鍵,unique修飾創(chuàng)建,也可以直接使用sql語(yǔ)句

    2024年02月10日
    瀏覽(31)
  • 【MySql系列】深入解析數(shù)據(jù)庫(kù)索引

    【MySql系列】深入解析數(shù)據(jù)庫(kù)索引

    MySQL索引是數(shù)據(jù)庫(kù)中一個(gè)關(guān)鍵的概念,它可以極大地提高查詢(xún)性能,加快數(shù)據(jù)檢索速度。但是,要充分發(fā)揮索引的作用,需要深入理解它們的工作原理和使用方式。 在本文中,我們將深入解析MySQL索引,探討它們的重要性、類(lèi)型、創(chuàng)建、維護(hù)以及最佳實(shí)踐。 在數(shù)據(jù)庫(kù)中,索引

    2024年02月08日
    瀏覽(32)
  • 【MySQL數(shù)據(jù)庫(kù) | 第十七篇】索引以及索引結(jié)構(gòu)介紹

    【MySQL數(shù)據(jù)庫(kù) | 第十七篇】索引以及索引結(jié)構(gòu)介紹

    目錄 前言: 索引簡(jiǎn)介:? 索引結(jié)構(gòu): ? ? ? ? ??二叉樹(shù)索引結(jié)構(gòu) ? ? ? ??Tree(普通二叉樹(shù)) ? ? ? ??B-Tree(多路平衡查找樹(shù)) ? ? ? ??B+Tree ? ? ? ???哈希索引數(shù)據(jù)結(jié)構(gòu) 總結(jié): 在實(shí)際生活中,我們對(duì)SQL語(yǔ)句進(jìn)行優(yōu)化實(shí)際上有很大一部分都是對(duì)索引進(jìn)行優(yōu)化,因此對(duì)索引

    2024年02月09日
    瀏覽(40)
  • MySQL數(shù)據(jù)庫(kù)索引的種類(lèi)、創(chuàng)建、刪除

    MySQL數(shù)據(jù)庫(kù)索引的種類(lèi)、創(chuàng)建、刪除

    目錄 一:MySQL 索引 1、MySQL 索引介紹 2、?索引的作用 ?3、索引的副作用 4、?創(chuàng)建索引的原則依據(jù) ?二、索引的分類(lèi)和創(chuàng)建 1、?普通索引 (1)?直接創(chuàng)建索引 (2)?修改表方式創(chuàng)建 (3)?創(chuàng)建表的時(shí)候指定索引 2、?唯一索引 (1)?直接創(chuàng)建唯一索引 (2)?修改表方式創(chuàng)建

    2024年02月09日
    瀏覽(1049)
  • 【Mysql系列】——詳細(xì)剖析數(shù)據(jù)庫(kù)“索引”【上篇】

    【Mysql系列】——詳細(xì)剖析數(shù)據(jù)庫(kù)“索引”【上篇】

    ? ? ??博客昵稱(chēng):博客小夢(mèng) ??最喜歡的座右銘:全神貫注的上吧?。?! ??作者簡(jiǎn)介:一名熱愛(ài)C/C++,算法,數(shù)據(jù)庫(kù)等技術(shù)、喜愛(ài)運(yùn)動(dòng)、熱愛(ài)K歌、敢于追夢(mèng)的小博主! ??博主小留言:哈嘍! ??各位CSDN的uu們,我是你的博客好友小夢(mèng),希望我的文章可以給您帶來(lái)一定的幫

    2024年02月02日
    瀏覽(24)
  • MySQL數(shù)據(jù)庫(kù)的ID列添加索引

    要為MySQL數(shù)據(jù)庫(kù)的ID列添加索引,可以使用以下語(yǔ)法: 其中, table_name 是要添加索引的表名, index_name 是索引的名稱(chēng), id 是要添加索引的列名。 例如,如果要為名為 users 的表的 id 列添加索引,可以執(zhí)行以下語(yǔ)句: 這將在 users 表的 id 列上創(chuàng)建名為 idx_id 的索引。 需要注意的

    2024年02月07日
    瀏覽(33)
  • B+樹(shù):MySQL數(shù)據(jù)庫(kù)索引的實(shí)現(xiàn)

    B+樹(shù):MySQL數(shù)據(jù)庫(kù)索引的實(shí)現(xiàn)

    作為一個(gè)軟件開(kāi)發(fā)工程師,你對(duì)數(shù)據(jù)庫(kù)肯定再熟悉不過(guò)了。作為主流的數(shù)據(jù)存儲(chǔ)系統(tǒng),它在我們的業(yè)務(wù)開(kāi)發(fā)中,有著舉足輕重的地位。在工作中,為了加速數(shù)據(jù)庫(kù)中數(shù)據(jù)的查找速度,我們常用的處理思路是,對(duì)表中數(shù)據(jù)創(chuàng)建索引。那你是否思考過(guò),數(shù)據(jù)庫(kù)索引是如何實(shí)現(xiàn)的呢

    2024年02月09日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包