網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一.數(shù)據(jù)庫(kù)查詢慢的原因
我們可以把查詢SQL執(zhí)行看做是一個(gè)任務(wù)的話,那它是由一些列子任務(wù)組成的,每個(gè)子任務(wù)都存在一定的時(shí)間消耗。通常情況下,導(dǎo)致慢查詢最根本的問(wèn)題就是需要訪問(wèn)的數(shù)據(jù)太多,
導(dǎo)致查詢不可避免的需要篩選大量的數(shù)據(jù)。
面對(duì)慢查詢,我們需要注意以下兩點(diǎn):
(1)查詢了過(guò)多不需要的數(shù)據(jù)
(2)掃描了額外的記
二.新數(shù)據(jù)庫(kù)腳本慢,有何原因?
一個(gè) SQL 執(zhí)行的很慢,我們要分兩種情況討論:
1、大多數(shù)情況下很正常,偶爾很慢,則有如下原因
(1)、數(shù)據(jù)庫(kù)在刷新臟頁(yè),例如 redo log 寫滿了需要同步到磁盤。
(2)、執(zhí)行的時(shí)候,遇到鎖,如表鎖、行鎖。
2、這條 SQL 語(yǔ)句一直執(zhí)行的很慢,則有如下原因。
(1)、沒(méi)有用上索引:例如該字段沒(méi)有索引;由于對(duì)字段進(jìn)行運(yùn)算、函數(shù)操作導(dǎo)致無(wú)法用索引。
(2)、數(shù)據(jù)庫(kù)選錯(cuò)了索引。
三.mysql中using的用法為:
using()用于兩張表的join查詢,要求using()指定的列在兩個(gè)表中均存在,并使用之用于join的條件。
示例:
select a., b. from a left join b using(colA);
等同于:
select a., b. from a left join b on a.colA = b.colA;
四.索引的作用
-
索引是什么,首先我們可以舉個(gè)例子,字典大家應(yīng)該都使用過(guò),我們可以使用目錄快速定位到所要查找的內(nèi)容,那么索引跟目錄的作用類似,在數(shù)據(jù)庫(kù)表記錄中,利用索引,可以快速過(guò)濾查找到數(shù)據(jù)記錄。
-
索引類型分類
2.1 普通索引
加快查詢速度
2.2 唯一索引
加快查詢速度,并且可以限制列值的唯一性,允許為空
唯一索引包括聯(lián)合唯一索引,多列形成的唯一索引,這些列可以唯一確定一條表記錄,可以為空
2.3 全文索引
主要針對(duì)文本的內(nèi)容進(jìn)行分詞,加快查詢速度
2.4 聯(lián)合索引
多列組成的索引,查詢效率提升高于多個(gè)單列索引合并的效率
2.5 主鍵索引
主鍵唯一性,加快查詢速度,不能為空 -
索引結(jié)構(gòu)分類
索引有很多分類,例如B-tree索引,哈希索引,全文索引等等,索引的實(shí)現(xiàn)是在存儲(chǔ)引擎層,并不是在后端服務(wù)器層,所以不同的存儲(chǔ)引擎支持的索引結(jié)構(gòu)也不一定一樣
3.1 B-tree索引
B-tree 索引普遍存在于存儲(chǔ)引擎中,他使用B-tree數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),如果對(duì)樹形數(shù)據(jù)結(jié)構(gòu)比較了解的話,就知道B-tree索引所帶來(lái)的好處了,他的每個(gè)葉子節(jié)點(diǎn)都會(huì)包含下一個(gè)節(jié)點(diǎn)的指針,非常方便查詢數(shù)據(jù)
B-tree 適用于全鍵值,鍵值范圍,或者前綴查找
3.2 哈希索引
哈希索引基于哈希表實(shí)現(xiàn),對(duì)于每一行數(shù)據(jù),存儲(chǔ)引擎會(huì)對(duì)所有的索引列計(jì)算一個(gè)哈希碼,然后存儲(chǔ)引擎會(huì)基于這個(gè)哈希碼來(lái)查找數(shù)據(jù),小編感覺(jué)有點(diǎn)像HashMap 中槽的查詢過(guò)程
3.3 全文索引
全文索引在幾種索引結(jié)構(gòu)類型中比較特殊,他查找的是文本中關(guān)鍵詞
4. 索引的正確使用
索引是建立在系統(tǒng)文件上的,會(huì)占用一定的內(nèi)存空間,另外數(shù)據(jù)在更新的時(shí)候也會(huì)去維護(hù)索引,消耗內(nèi)存,所以索引一定要正確的使用,索引并不是越多越好,要根據(jù)具體的查詢業(yè)務(wù)來(lái)規(guī)劃索引的建立。
建議不要使用索引的幾種情況:1.區(qū)分度不是很大的字段,例如 性別 sex
2.頻繁更新的字段
3.字符串類型的字段 或者 文本類型的字段
4.不在where列中出現(xiàn)的索引
索引失效的幾種情況:
1.查詢列中有函數(shù)計(jì)算
2. 查詢列中有模糊查詢,“%cloum”,可以使用"cloum%" 代替,如果要使用"%column%",那么select 列中是索引列
3.如果查詢條件中有or, 索引會(huì)失效,除非所有條件都加上索引
4.使用不等于(!= 或者 <>)
5.is null 或者 is not null
6.字符串不加引號(hào),會(huì)導(dǎo)致索引失效
7.最左原則,聯(lián)合索引中會(huì)遵循最左原則,即如果要使用聯(lián)合索引,那么前面的索引列一定要包含,舉個(gè)例子,
有個(gè)聯(lián)合索引(a,b,c) 那么查詢條件中只能是 a=1 或者 a=1 and b=1 或者 a=1 and b=1 and c=1,不然索引就會(huì)失效
原文鏈接:https://blog.csdn.net/qq_41512902/article/details/125617051
相關(guān)推薦
- 2022-07-03 python類的私有屬性和公共屬性說(shuō)明_python
- 2022-02-18 解決 Syntax Error: Error: PostCSS received undefined
- 2022-03-29 C#算法之兩數(shù)之和_C#教程
- 2022-04-12 C#實(shí)現(xiàn)六大設(shè)計(jì)原則之單一職責(zé)原則_C#教程
- 2022-03-04 Tue Dec 01 00:00:00 GMT+08:00 1998 轉(zhuǎn)成自定義字符串
- 2022-07-22 C語(yǔ)言輸出所有水仙花數(shù)
- 2022-04-07 使用swift實(shí)現(xiàn)計(jì)算器功能_Swift
- 2022-11-20 C#?崩潰異常中研究頁(yè)堆布局的詳細(xì)過(guò)程_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支