日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql多数据表关联查询慢问题解决方案

發(fā)布時(shí)間:2023/12/14 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql多数据表关联查询慢问题解决方案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問題一:遇到一個(gè)問題,mysql庫(kù)下表A有幾萬(wàn)條數(shù)據(jù);表B也有幾萬(wàn)條數(shù)據(jù),結(jié)果兩表關(guān)聯(lián)的時(shí)候,查詢超級(jí)慢,30s內(nèi)沒反應(yīng)。

問題一解決方案:

1. 加索引,但索引不要亂加,兩表關(guān)聯(lián),必須要?jiǎng)?chuàng)建的索引是兩表的管理字段 e.g

select * from A t1 left join B t2? on t1.did= t2.did and t1.uid = t2.uid

這種情況下,一定要給A表的uid和did創(chuàng)建索引,如果uid值是唯一那就創(chuàng)建唯一所引UNIQUE;否則就創(chuàng)建normal索引。

基本上加索引之后,查詢速度立馬就秒級(jí)了。

有索引就像新華字典的目錄一樣按照a,b,c順序排好序,查找時(shí)速率才會(huì)高。

問題二:查詢語(yǔ)句,主表?yè)Q了之后,也加了關(guān)聯(lián)字段的索引,結(jié)果還是很慢,就很奇怪,只是主表?yè)Q了而已

問題二解決方案:原來(lái)是兩張表的字符集不一樣,B表utf8(3個(gè)字節(jié))和表A utf8mb4(4個(gè)字節(jié))字符集兼容問題。

select * from A left join B where A.id = B.id? ?A作為主表字符集包含B,可以很快查詢導(dǎo)數(shù)據(jù)

select * from B?left join A? where A.id = B.id? ?B作為主表則無(wú)法快速查詢到數(shù)據(jù),因?yàn)锽無(wú)法兼容4個(gè)字符的數(shù)據(jù),只能全表掃描

索引和主鍵的區(qū)別

索引分為:主鍵索引(SPATAIL)、唯一索引(UNIQUE)、常規(guī)索引(NORMAL)和全文索引(FULLTEXT);

創(chuàng)建索引一般為

主鍵是一種約束,唯一索引是一種索引,兩者在本質(zhì)上是不同的

1.唯一性索引列允許空值,而主鍵列不允許為空值

2.主鍵列在創(chuàng)建時(shí),已經(jīng)默認(rèn)為非空值 + 唯一索引了,在navicat中可能看不到,可以使用mysql查詢語(yǔ)句來(lái)查看#show index from 表名;

3.主鍵可以被其他表引用為外鍵,而唯一索引不能

4. 主鍵更適合那些不容易更改的唯一標(biāo)識(shí),如自動(dòng)遞增列、身份證號(hào)等

組合索引創(chuàng)建

當(dāng)我們的where查詢存在多個(gè)條件查詢的時(shí)候,我們需要對(duì)查詢的列創(chuàng)建組合索引

減少開銷:創(chuàng)建A B C 組合索引,相當(dāng)于創(chuàng)建了(A)(A,B)(A,B,C)3個(gè)索引。?(a,b,c)多列索引和 (a,c,b)是不一樣的

覆蓋索引:查詢 select A,B,C from 表名 ,由于查詢的字段存在索引頁(yè)中,那么可以從索引中直接獲取,而不需要回表查詢。

組合索引的生效原則從前往后依次使用生效,如果中間某個(gè)索引沒有使用,那么斷點(diǎn)前面的索引部分起作用,斷點(diǎn)后面的索引沒有起作用;

where a=1 and b=2 and c=3 .... 這種三個(gè)索引順序使用中間沒有斷點(diǎn),全部發(fā)揮作用; where a=3 and c=5... 這種情況下b就是斷點(diǎn),a發(fā)揮了效果,c沒有效果 where b=3 and c=4... 這種情況下a就是斷點(diǎn),在a后面的索引都沒有發(fā)揮作用,這種寫法聯(lián)合索引沒有發(fā)揮任何效果; where b=45 and a=3 and c=5 .... 這個(gè)跟第一個(gè)一樣,全部發(fā)揮作用,abc只要用上了就行,跟寫的順序無(wú)關(guān)?

索引基本創(chuàng)建注意事項(xiàng)

1. 索引不是越多越好,根據(jù)需要?jiǎng)?chuàng)建;對(duì)于重復(fù)數(shù)據(jù)的字段,沒必要?jiǎng)?chuàng)建索引

2.涉及到關(guān)聯(lián)表的一定要?jiǎng)?chuàng)建關(guān)聯(lián)字段的索引

3. 一般情況下不鼓勵(lì)使用like操作,如果非使用不可,如何使用也是一個(gè)問題。like “%aaa%” 不會(huì)使用索引而like “aaa%”可以使用索引

4.使用短索引。對(duì)字符列進(jìn)行索引,盡可能指定長(zhǎng)度。短索引,不僅可以提高查詢速度而且能節(jié)省磁盤空間

索引不生效的情況

1.?在索引字段上運(yùn)算? where id-1=1 或者WHERE column(column)> 10;

2. 隱性轉(zhuǎn)換。字符和數(shù)值型

3.like “%aaa%”? "%aaa"不會(huì)使用索引而like “aaa%”可以使用索引

4.如果多個(gè)OR條件中有其中一個(gè)條件沒有索引,則必須進(jìn)行全表索引

什么情況下適合建立索引?

一般來(lái)說(shuō),在WHERE和JOIN中出現(xiàn)的列需要建立索引。因?yàn)镸ySQL只對(duì),>=,BETWEEN,IN,以及某些時(shí)候的LIKE才會(huì)使用索引。

索引缺點(diǎn)

1..雖然索引大大提高了查詢速度,同時(shí)會(huì)降低更新表的速度,如對(duì)表進(jìn)行insert、update和delete。因?yàn)楦卤頃r(shí),不僅要保存數(shù)據(jù),還要保存索引文件。
2.建立索引會(huì)占用磁盤空間的索引文件。如果你在一個(gè)大表上創(chuàng)建了多種組合索引,索引文件的會(huì)增長(zhǎng)很快。
索引只是提高效率的一個(gè)因素,如果有大數(shù)據(jù)量的表,就需要花時(shí)間研究建立最優(yōu)秀的索引,或優(yōu)化查詢語(yǔ)句。

查看無(wú)效索引,清除無(wú)效索引?

查看索引是否生效:https://blog.csdn.net/u014470581/article/details/68065590

參考鏈接:https://www.cnblogs.com/yszr/p/10674729.html

總結(jié)

以上是生活随笔為你收集整理的mysql多数据表关联查询慢问题解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。