索引失效場(chǎng)景/索引種類/全文索引用法/sql執(zhí)行順序/死鎖如何解決/什么是回表/大表如何優(yōu)化/推薦用b+樹的原因

【【【Mysql數(shù)據(jù)庫(kù)中椒惨,什么情況下設(shè)置了索引但?法使??
1. 沒有符合最左前綴原則d
2. 字段進(jìn)?了隱式數(shù)據(jù)類型轉(zhuǎn)化【數(shù)據(jù)庫(kù)是varchar阅束,但是傳參是int的不行奖地,反之是可以的】
3. ?索引沒有全表掃描效率?

【【【索引種類有哪些
system:系統(tǒng)表中只有一條記錄奈附,或者對(duì)于一個(gè)返回單條記錄的衍生表進(jìn)行主查詢。這種類型非惩W玻快滋将,但實(shí)際開發(fā)中很少遇到。
const:當(dāng)索引列是主鍵或唯一鍵撞蚕,并且查詢條件完全匹配這個(gè)值時(shí),可以到達(dá)這個(gè)級(jí)別邮破。例如诈豌,SELECT * FROM table WHERE id = 1;,其中id是主鍵或唯一索引抒和。
eq_ref:對(duì)于每個(gè)索引鍵的查詢,返回匹配唯一行數(shù)據(jù)彤蔽。這通常發(fā)生在使用主鍵或唯一索引進(jìn)行查詢時(shí)摧莽。
【普通索引】ref:非唯一性索引,對(duì)于每個(gè)索引鍵的查詢顿痪,返回匹配的所有行(可以是0镊辕,或多個(gè))。
range:檢索指定范圍的行蚁袭,查找一個(gè)范圍內(nèi)的數(shù)據(jù)征懈,例如使用BETWEEN, IN, <, >等操作符的查詢。
index:索引全表掃描揩悄,比ALL快卖哎,因?yàn)樗饕募ǔ1葦?shù)據(jù)文件小,并且索引是按順序存儲(chǔ)的删性。
ALL:全表掃描亏娜,這是最不高效的類型,因?yàn)闆]有使用索引蹬挺,數(shù)據(jù)庫(kù)需要掃描整個(gè)表來(lái)查找匹配的行
MySQL 索引類型有哪些维贺?
主鍵索引
索引列中的值必須是唯一的,不允許有空值巴帮。
普通索引
MySQL中基本索引類型溯泣,沒有什么限制,允許在定義索引的列中插入重復(fù)值和空值榕茧。
唯一索引
索引列中的值必須是唯一的垃沦,但是允許為空值。
全文索引
只能在文本類型CHAR,VARCHAR,TEXT類型字段上創(chuàng)建全文索引雪猪。字段長(zhǎng)度比較大時(shí)栏尚,如果創(chuàng)建普
通索引,在進(jìn)行l(wèi)ike模糊查詢時(shí)效率比較低,這時(shí)可以創(chuàng)建全文索引译仗。MyISAM和InnoDB中都可以
使用全文索引抬虽。
空間索引
MySQL在5.7之后的版本支持了空間索引,而且支持OpenGIS幾何數(shù)據(jù)模型纵菌。MySQL在空間索引這
方面遵循OpenGIS幾何數(shù)據(jù)模型規(guī)則阐污。
前綴索引
在文本類型如CHAR,VARCHAR,TEXT類列上創(chuàng)建索引時(shí),可以指定索引列的長(zhǎng)度咱圆,但是數(shù)值類型不
能指定笛辟。
阿里內(nèi)部資料
其他(按照索引列數(shù)量分類)
1. 單列索引
2. 組合索引
組合索引的使用,需要遵循最左前綴匹配原則(最左匹配原則)序苏。一般情況下在條件允許的情
況下使用組合索引替代多個(gè)單列索引使用手幢。
【【【全文索引的用法
#查看長(zhǎng)度是多少
SHOW VARIABLES LIKE 'ft_min_word_len';
SHOW VARIABLES LIKE 'innodb_ft_min_token_size';

#1-編輯配置文件
vim /etc/my.cnf
#添加以下內(nèi)容
    [mysqld]
    ft_min_word_len = 1
    innodb_ft_min_token_size = 1
#2-并且重啟mysql服務(wù)
sudo systemctl restart mysqld
#3-刪除之前創(chuàng)建的全文索引字段并且重新創(chuàng)建
#4-查詢寫法
SELECT * FROM user WHERE MATCH(name) AGAINST(concat('+', 'c', '*') IN BOOLEAN MODE);

說說在 MySQL 中一條查詢 SQL 是如何執(zhí)行的?
比如下面這條SQL語(yǔ)句:
1. 取得鏈接忱详,使用使用到 MySQL 中的連接器围来。
select name from t_user where id=1
阿里內(nèi)部資料
2. 查詢緩存,key 為 SQL 語(yǔ)句匈睁,value 為查詢結(jié)果监透,如果查到就直接返回。不建議使用次緩存航唆,
在 MySQL 8.0 版本已經(jīng)將查詢緩存刪除胀蛮,也就是說 MySQL 8.0 版本后不存在此功能。
3. 分析器糯钙,分為詞法分析和語(yǔ)法分析粪狼。此階段只是做一些 SQL 解析,語(yǔ)法校驗(yàn)超营。所以一般語(yǔ)法錯(cuò)
誤在此階段鸳玩。
4. 優(yōu)化器,是在表里有多個(gè)索引的時(shí)候演闭,決定使用哪個(gè)索引不跟;或者一個(gè)語(yǔ)句中存在多表關(guān)聯(lián)的時(shí)
候(join),決定各個(gè)表的連接順序米碰。
5. 執(zhí)行器窝革,通過分析器讓 SQL 知道你要干啥,通過優(yōu)化器知道該怎么做吕座,于是開始執(zhí)行語(yǔ)句虐译。執(zhí)
行語(yǔ)句的時(shí)候還要判斷是否具備此權(quán)限,沒有權(quán)限就直接返回提示沒有權(quán)限的錯(cuò)誤吴趴;有權(quán)限則
打開表漆诽,根據(jù)表的引擎定義,去使用這個(gè)引擎提供的接口,獲取這個(gè)表的第一行厢拭,判斷 id 是都
等于 1兰英。如果是,直接返回供鸠;如果不是繼續(xù)調(diào)用引擎接口去下一行畦贸,重復(fù)相同的判斷,直到取
到這個(gè)表的最后一行楞捂,最后返回薄坏。

【【【oracle查詢鎖定的表和對(duì)應(yīng)會(huì)話:
SELECT
    o.object_name,
    s.sid,
    s.serial#,
    p.spid,
    s.username,
    s.program
FROM
    v$locked_object l
JOIN dba_objects o ON l.object_id = o.object_id
JOIN v$session s ON l.session_id = s.sid
LEFT JOIN v$process p ON p.addr = s.paddr;

ALTER SYSTEM KILL SESSION 'sid,serial#';

【【【mysql查找死鎖和主動(dòng)殺死方法
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
kill trx_mysql_thread_id;

【【【回表可以舉個(gè)sql例子嘛
當(dāng)然可以。以MySQL數(shù)據(jù)庫(kù)為例寨闹,假設(shè)我們有一個(gè)名為employees的表胶坠,其中包含以下列:
sql
CREATE TABLE employees (
    id INT NOT NULL AUTO_INCREMENT,
    firstName VARCHAR(50),
    lastName VARCHAR(50),
    department VARCHAR(50),
    salary DECIMAL(10, 2),
    PRIMARY KEY (id),
    KEY idx_department (department)
) ENGINE=InnoDB;
在這個(gè)表中,id是主鍵鼻忠,而department是一個(gè)普通索引涵但。
不需要回表的情況:
如果我們的查詢只涉及department字段,并且這個(gè)字段被索引覆蓋帖蔓,那么就不需要回表:
sql
SELECT department FROM employees WHERE department = 'Sales';
在這個(gè)查詢中,MySQL可以直接使用idx_department索引來(lái)獲取所有在銷售部門的記錄瞳脓,不需要訪問主鍵索引塑娇。
需要回表的情況:
如果查詢涉及到不在索引中的字段,比如salary劫侧,那么就需要回表:
sql
SELECT firstName, salary FROM employees WHERE department = 'Sales';
在這個(gè)查詢中埋酬,MySQL首先會(huì)使用idx_department索引來(lái)找到所有在銷售部門的記錄的id,然后它需要使用這些id去主鍵索引中查找每一行的firstName和salary字段烧栋,因?yàn)檫@些字段不在idx_department索引中写妥。這個(gè)過程就是回表。
避免回表的優(yōu)化:
為了優(yōu)化查詢性能并避免回表审姓,我們可以創(chuàng)建一個(gè)覆蓋索引珍特,這個(gè)索引包含查詢中需要的所有字段:
sql
CREATE INDEX idx_department_salary ON employees (department, salary);
現(xiàn)在,如果我們使用新的索引進(jìn)行查詢:
sql
SELECT department, salary FROM employees WHERE department = 'Sales';
MySQL可以直接使用idx_department_salary索引來(lái)獲取所需的數(shù)據(jù)魔吐,而不需要回表扎筒,因?yàn)樗饕幸呀?jīng)包含了department和salary字段。這就是所謂的覆蓋索引酬姆,它覆蓋了查詢所需的全部數(shù)據(jù)嗜桌,從而提高了查詢效率。
【【【大表如何優(yōu)化辞色?
當(dāng)MySQL單表記錄數(shù)過大時(shí)骨宠,數(shù)據(jù)庫(kù)的CRUD性能會(huì)明顯下降,一些常見的優(yōu)化措施如下:
1. 限定數(shù)據(jù)的范圍
務(wù)必禁止不帶任何限制數(shù)據(jù)范圍條件的查詢語(yǔ)句。比如:我們當(dāng)用戶在查詢訂單歷史的時(shí)候层亿,我們
可以控制在一個(gè)月的范圍內(nèi)桦卒;
2. 讀/寫分離
經(jīng)典的數(shù)據(jù)庫(kù)拆分方案,主庫(kù)負(fù)責(zé)寫棕所,從庫(kù)負(fù)責(zé)讀闸盔;
3. 垂直分區(qū)
根據(jù)數(shù)據(jù)庫(kù)里面數(shù)據(jù)表的相關(guān)性進(jìn)行拆分。 例如琳省,用戶表中既有用戶的登錄信息又有用戶的基本信
息迎吵,可以將用戶表拆分成兩個(gè)單獨(dú)的表,甚至放到單獨(dú)的庫(kù)做分庫(kù)针贬。
簡(jiǎn)單來(lái)說垂直拆分是指數(shù)據(jù)表列的拆分击费,把一張列比較多的表拆分為多張表。 如下圖所示桦他,這樣來(lái)
說大家應(yīng)該就更容易理解了蔫巩。
1583307481617
垂直拆分的優(yōu)點(diǎn): 可以使得列數(shù)據(jù)變小,在查詢時(shí)減少讀取的Block數(shù)快压,減少I/O次數(shù)圆仔。此外,
垂直分區(qū)可以簡(jiǎn)化表的結(jié)構(gòu)蔫劣,易于維護(hù)坪郭。
垂直拆分的缺點(diǎn): 主鍵會(huì)出現(xiàn)冗余,需要管理冗余列脉幢,并會(huì)引起Join操作歪沃,可以通過在應(yīng)用層
進(jìn)行Join來(lái)解決。此外嫌松,垂直分區(qū)會(huì)讓事務(wù)變得更加復(fù)雜沪曙;
B樹和B+樹的區(qū)別,為什么Mysql使?B+樹
B樹的特點(diǎn):
1. 節(jié)點(diǎn)排序
2. ?個(gè)節(jié)點(diǎn)了可以存多個(gè)元素萎羔,多個(gè)元素也排序了
B+樹的特點(diǎn):
1. 擁有B樹的特點(diǎn)
2. 葉?節(jié)點(diǎn)之間有指針
3. ?葉?節(jié)點(diǎn)上的元素在葉?節(jié)點(diǎn)上都冗余了液走,也就是葉?節(jié)點(diǎn)中存儲(chǔ)了所有的元素,并且排好順序
Mysql索引使?的是B+樹外驱,因?yàn)樗饕?來(lái)加快查詢的育灸,?B+樹通過對(duì)數(shù)據(jù)進(jìn)?排序所以是可以提?查詢
速度的,然后通過?個(gè)節(jié)點(diǎn)中可以存儲(chǔ)多個(gè)元素昵宇,從?可以使得B+樹的?度不會(huì)太?磅崭,在Mysql中?個(gè)
Innodb?就是?個(gè)B+樹節(jié)點(diǎn),?個(gè)Innodb?默認(rèn)16kb瓦哎,所以?般情況下?顆兩層的B+樹可以存2000萬(wàn)
?左右的數(shù)據(jù)砸喻,然后通過利?B+樹葉?節(jié)點(diǎn)存儲(chǔ)了所有數(shù)據(jù)并且進(jìn)?了排序柔逼,并且葉?節(jié)點(diǎn)之間有指針,
可以很好的?持全表掃描割岛,范圍查找等SQL語(yǔ)句愉适。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市癣漆,隨后出現(xiàn)的幾起案子维咸,更是在濱河造成了極大的恐慌,老刑警劉巖惠爽,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌蓖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡婚肆,警方通過查閱死者的電腦和手機(jī)租副,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)较性,“玉大人用僧,你說我怎么就攤上這事≡蘖” “怎么了责循?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)攀操。 經(jīng)常有香客問我沼死,道長(zhǎng),這世上最難降的妖魔是什么崔赌? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮耸别,結(jié)果婚禮上健芭,老公的妹妹穿的比我還像新娘。我一直安慰自己秀姐,他們只是感情好慈迈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著省有,像睡著了一般痒留。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠢沿,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天伸头,我揣著相機(jī)與錄音,去河邊找鬼舷蟀。 笑死恤磷,一個(gè)胖子當(dāng)著我的面吹牛面哼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扫步,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼魔策,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了河胎?” 一聲冷哼從身側(cè)響起闯袒,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎游岳,沒想到半個(gè)月后政敢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吭历,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年堕仔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌区。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摩骨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朗若,到底是詐尸還是另有隱情恼五,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布哭懈,位于F島的核電站灾馒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遣总。R本人自食惡果不足惜睬罗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旭斥。 院中可真熱鬧容达,春花似錦、人聲如沸垂券。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菇爪。三九已至算芯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凳宙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工近速, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堪旧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓奖亚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親昔字。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爆袍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容