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

面試官:講講MySql索引失效的幾種情況

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

索引失效

準(zhǔn)備數(shù)據(jù):

CREATE TABLE `dept` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`deptName` VARCHAR(30) DEFAULT NULL,
	`address` VARCHAR(40) DEFAULT NULL,
	ceo INT NULL ,
	PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1;

CREATE TABLE `emp` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`empno` INT NOT NULL ,
	`name` VARCHAR(20) DEFAULT NULL,
	`age` INT(3) DEFAULT NULL,
	`deptId` INT(11) DEFAULT NULL,
	PRIMARY KEY (`id`)
	#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1;

1、計(jì)算、函數(shù)導(dǎo)致索引失效

-- 顯示查詢分析
EXPLAIN SELECT * FROM emp WHERE emp.name  LIKE 'abc%';
EXPLAIN SELECT * FROM emp WHERE LEFT(emp.name,3) = 'abc'; --索引失效

2、LIKE以%開(kāi)頭索引失效

EXPLAIN SELECT * FROM emp WHERE name LIKE '%ab%'; --索引失效

拓展:Alibaba《Java開(kāi)發(fā)手冊(cè)》

【強(qiáng)制】頁(yè)面搜索嚴(yán)禁左模糊或者全模糊,如果需要請(qǐng)走搜索引擎來(lái)解決。

3、不等于(!= 或者<>)索引失效

EXPLAIN SELECT * FROM emp WHERE emp.name = 'abc' ;
EXPLAIN SELECT * FROM emp WHERE emp.name <> 'abc' ; --索引失效

4、IS NOT NULL 和 IS NULL

EXPLAIN SELECT * FROM emp WHERE emp.name IS NULL;
EXPLAIN SELECT * FROM emp WHERE emp.name IS NOT NULL; --索引失效

注意:當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的索引列的NULL值達(dá)到比較高的比例的時(shí)候,即使在IS NOT NULL 的情況下 MySQL的查詢優(yōu)化器會(huì)選擇使用索引,此時(shí)type的值是range(范圍查詢)

-- 將 id>20000 的數(shù)據(jù)的 name 值改為 NULL
UPDATE emp SET `name` = NULL WHERE `id` > 20000;

-- 執(zhí)行查詢分析,可以發(fā)現(xiàn) IS NOT NULL 使用了索引
-- 具體多少條記錄的值為NULL可以使索引在IS NOT NULL的情況下生效,由查詢優(yōu)化器的算法決定
EXPLAIN SELECT * FROM emp WHERE emp.name IS NOT NULL;

測(cè)試完將name的值改回來(lái)

UPDATE emp SET `name` = rand_string(6) WHERE `id` > 20000;

5、類(lèi)型轉(zhuǎn)換導(dǎo)致索引失效

EXPLAIN SELECT * FROM emp WHERE name='123'; 
EXPLAIN SELECT * FROM emp WHERE name= 123; --索引失效

6、全值匹配我最?lèi)?ài)

準(zhǔn)備:

-- 首先刪除之前創(chuàng)建的索引
CALL proc_drop_index("atguigudb","emp");

問(wèn)題:為以下查詢語(yǔ)句創(chuàng)建哪種索引效率最高

-- 查詢分析
EXPLAIN SELECT * FROM emp WHERE emp.age = 30 and deptid = 4 AND emp.name = 'abcd';
-- 執(zhí)行SQL
SELECT * FROM emp WHERE emp.age = 30 and deptid = 4 AND emp.name = 'abcd';
-- 查看執(zhí)行時(shí)間
SHOW PROFILES;

創(chuàng)建索引并重新執(zhí)行以上測(cè)試:

-- 創(chuàng)建索引:分別創(chuàng)建以下三種索引的一種,并分別進(jìn)行以上查詢分析
CREATE INDEX idx_age ON emp(age);
CREATE INDEX idx_age_deptid ON emp(age,deptid);
CREATE INDEX idx_age_deptid_name ON emp(age,deptid,`name`);

結(jié)論:可以發(fā)現(xiàn)最高效的查詢應(yīng)用了聯(lián)合索引 idx_age_deptid_name

7、最佳左前綴法則

準(zhǔn)備:

-- 首先刪除之前創(chuàng)建的索引
CALL proc_drop_index("atguigudb","emp");
-- 創(chuàng)建索引
CREATE INDEX idx_age_deptid_name ON emp(age,deptid,`name`);

問(wèn)題:以下這些SQL語(yǔ)句能否命中 idx_age_deptid_name 索引,可以匹配多少個(gè)索引字段

測(cè)試:

  • 如果索引了多列,要遵守最左前綴法則。即查詢從索引的最左前列開(kāi)始并且不跳過(guò)索引中的列。
  • 過(guò)濾條件要使用索引,必須按照索引建立時(shí)的順序,依次滿足,一旦跳過(guò)某個(gè)字段,索引后面的字段都無(wú)法被使用。
EXPLAIN SELECT * FROM emp WHERE emp.age=30 AND emp.name = 'abcd' ;
-- EXPLAIN結(jié)果:
-- key_len:5 只使用了age索引
-- 索引查找的順序?yàn)?age、deptid、name,查詢條件中不包含deptid,無(wú)法使用deptid和name索引

EXPLAIN SELECT * FROM emp WHERE emp.deptid=1 AND emp.name = 'abcd';
-- EXPLAIN結(jié)果:
-- type: ALL, 執(zhí)行了全表掃描
-- key_len: NULL, 索引失效
-- 索引查找的順序?yàn)?age、deptid、name,查詢條件中不包含age,無(wú)法使用整個(gè)索引

EXPLAIN SELECT * FROM emp WHERE emp.age = 30 AND emp.deptid=1 AND emp.name = 'abcd';
-- EXPLAIN結(jié)果:
-- 索引查找的順序?yàn)?age、deptid、name,匹配所有索引字段

EXPLAIN SELECT * FROM emp WHERE emp.deptid=1 AND emp.name = 'abcd' AND emp.age = 30;
-- EXPLAIN結(jié)果:
-- 索引查找的順序?yàn)?age、deptid、name,匹配所有索引字段

8、索引中范圍條件右邊的列失效

準(zhǔn)備:

-- 首先刪除之前創(chuàng)建的索引
CALL proc_drop_index("atguigudb","emp");

問(wèn)題:為以下查詢語(yǔ)句創(chuàng)建哪種索引效率最高

EXPLAIN SELECT * FROM emp WHERE emp.age=30 AND emp.deptId>1000 AND emp.name = 'abc'; 

測(cè)試1:

-- 創(chuàng)建索引并執(zhí)行以上SQL語(yǔ)句的EXPLAIN
CREATE INDEX idx_age_deptid_name ON emp(age,deptid,`name`);
-- key_len:10, 只是用了 age 和 deptid索引,name失效

注意:當(dāng)我們修改deptId的范圍條件的時(shí)候,例如deptId>100,那么整個(gè)索引失效,MySQL的優(yōu)化器基于成本計(jì)算后認(rèn)為沒(méi)必要使用索引了,所以就進(jìn)行了全表掃描。(注意:因?yàn)楸碇械臄?shù)據(jù)是隨機(jī)生成的,因此實(shí)際測(cè)試中根據(jù)具體數(shù)據(jù)的不同測(cè)試的結(jié)果也會(huì)不一樣,最終是否使用索引由優(yōu)化器決定)

測(cè)試2:

-- 創(chuàng)建索引并執(zhí)行以上SQL語(yǔ)句的EXPLAIN(將deptid索引的放在最后)
CREATE INDEX idx_age_name_deptid ON emp(age,`name`,deptid);
-- 使用了完整的索引

補(bǔ)充:以上兩個(gè)索引都存在的時(shí)候,MySQL優(yōu)化器會(huì)自動(dòng)選擇最好的方案文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-508057.html

到了這里,關(guān)于面試官:講講MySql索引失效的幾種情況的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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進(jìn)階優(yōu)化篇02——索引失效的10種情況及原理

    Mysql進(jìn)階優(yōu)化篇02——索引失效的10種情況及原理

    前 言 ?? 作者簡(jiǎn)介:半舊518,長(zhǎng)跑型選手,立志堅(jiān)持寫(xiě)10年博客,專注于java后端 ?? 專欄簡(jiǎn)介:mysql基礎(chǔ)、進(jìn)階,主要講解mysql數(shù)據(jù)庫(kù)sql刷題、進(jìn)階知識(shí),包括索引、數(shù)據(jù)庫(kù)調(diào)優(yōu)、分庫(kù)分表等 ?? 文章簡(jiǎn)介:本文將介紹索引失效的10種情況及原理,絕對(duì)不需要死記硬背,建議收

    2024年02月02日
    瀏覽(23)
  • 索引失效的 12 種情況

    目錄 一、未使用索引字段進(jìn)行查詢 二、索引列使用了函數(shù)或表達(dá)式 三、使用了不等于(!= 或 )操作符 四、LIKE 操作符的模糊查詢 五、對(duì)索引列進(jìn)行了數(shù)據(jù)類(lèi)型轉(zhuǎn)換 六、使用 OR 連接多個(gè)條件 七、表中數(shù)據(jù)量較少 八、索引列上存在大量重復(fù)值 九、數(shù)據(jù)分布不均勻 十、索引

    2024年02月19日
    瀏覽(24)
  • SQL筆記 -- 索引失效情況

    對(duì)于多列索引,過(guò)濾條件要使用索引必須按照索引建立時(shí)的順序,依次滿足,一旦跳過(guò)某個(gè)字段,索引后面的字段都無(wú)法被使用。 例如以下情況,索引從左到右的順序?yàn)閍ge,classId,name,但是在查詢時(shí)跳過(guò)了age,因此該查詢無(wú)法使用索引。 查詢條件中使用了函數(shù)會(huì)導(dǎo)致索引失

    2024年01月20日
    瀏覽(20)
  • 索引失效的七種情況

    以上這些情況都可能導(dǎo)致數(shù)據(jù)庫(kù)查詢時(shí)無(wú)法有效地使用索引,從而影響查詢性能。為了避免索引失效,需要優(yōu)化查詢語(yǔ)句,合理設(shè)計(jì)索引,盡量避免上述情況的出現(xiàn)。

    2024年02月10日
    瀏覽(23)
  • 關(guān)于load過(guò)高的幾種情況

    Linux 中 load啥意思 \\\"Load\\\" 在 Linux 系統(tǒng)中通常是指系統(tǒng)的負(fù)載情況,也稱為系統(tǒng)負(fù)荷。它指的是系統(tǒng)正在運(yùn)行的進(jìn)程數(shù)量以及這些進(jìn)程對(duì)系統(tǒng)資源的使用情況,例如 CPU、內(nèi)存、磁盤(pán) I/O 等。Linux 系統(tǒng)的負(fù)載通常由三個(gè)數(shù)字表示,分別對(duì)應(yīng)于過(guò)去 1 分鐘、5 分鐘和 15 分鐘內(nèi)的平均

    2024年02月10日
    瀏覽(41)
  • JS中內(nèi)存泄漏的幾種情況

    JavaScript 中的內(nèi)存泄漏是指程序中使用的內(nèi)存不再被需要卻沒(méi)有被釋放,最終導(dǎo)致瀏覽器或者 Node.js 進(jìn)程使用的內(nèi)存越來(lái)越大,直到程序崩潰或者系統(tǒng)運(yùn)行緩慢。 在 JavaScript 中,內(nèi)存泄漏通常是由于變量、對(duì)象、閉包、事件監(jiān)聽(tīng)器等長(zhǎng)期存在而沒(méi)有被釋放引起的。這些長(zhǎng)期存

    2024年02月03日
    瀏覽(21)
  • 避坑:.NET內(nèi)存泄露的幾種情況

    內(nèi)存“泄露”是開(kāi)發(fā)中常見(jiàn)的問(wèn)題之一,它會(huì)導(dǎo)致應(yīng)用程序占用越來(lái)越多的內(nèi)存資源,最終可能導(dǎo)致系統(tǒng)性能下降甚至崩潰。軟件開(kāi)發(fā)者需要了解在程序中出現(xiàn)內(nèi)存泄露的情況,以避免軟件出現(xiàn)該的問(wèn)題。 什么是內(nèi)存“泄露”? 內(nèi)存泄露是申請(qǐng)了內(nèi)存空間的變量一直在占用

    2024年02月11日
    瀏覽(27)
  • 時(shí)間狀語(yǔ)前不用介詞的幾種情況

    1. today,yesterday, tomorrow,tonight, yesterday/tomorrow morning(evening, afternoon),today week (下周的今天) there is a football game tomorrow morning. 2. 表示時(shí)間的短語(yǔ)里面有next, last, one, this,these,those,every,each,some,any,all等單詞,介詞應(yīng)該省略。 i will see you next week. you can come any days you want. 你哪天來(lái)都可以

    2023年04月09日
    瀏覽(18)
  • Linux 查看內(nèi)存使用情況的幾種方法

    Linux 查看內(nèi)存使用情況的幾種方法

    *以下內(nèi)容為本人的學(xué)習(xí)筆記,如需要轉(zhuǎn)載,請(qǐng)聲明原文鏈接 微信公眾號(hào)「ENG八戒」https://mp.weixin.qq.com/s/27UaVm5_FMhCnxB88pc0QA 在運(yùn)行 Linux 系統(tǒng)的過(guò)程中為了讓電腦或者服務(wù)器以最佳水平運(yùn)行,常常需要監(jiān)控內(nèi)存統(tǒng)計(jì)信息。 那么今天我們就來(lái)看看有哪些方法可以訪問(wèn)所有相關(guān)信息

    2023年04月20日
    瀏覽(28)
  • sql數(shù)據(jù)庫(kù)去重的幾種情況

    sql數(shù)據(jù)庫(kù)去重的幾種情況

    本文主要總結(jié)數(shù)據(jù)庫(kù)去掉重復(fù)數(shù)據(jù)的方法 去掉重復(fù)數(shù)據(jù)的方法: 第一種:distinct 根據(jù)單個(gè)字段去重,能精確去重; 作用在多個(gè)字段時(shí),只有當(dāng)這幾個(gè)字段的完全相同時(shí),才能去重; distinct只能放在SQL語(yǔ)句中的第一個(gè),才會(huì)起作用 上圖舉例說(shuō)明:圖中student_name 為 tes

    2024年02月12日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包