mysql多数据表关联查询慢问题解决方案
問題一:遇到一個問題,mysql庫下表A有幾萬條數據;表B也有幾萬條數據,結果兩表關聯的時候,查詢超級慢,30s內沒反應。
問題一解決方案:
1. 加索引,但索引不要亂加,兩表關聯,必須要創建的索引是兩表的管理字段 e.g
select * from A t1 left join B t2? on t1.did= t2.did and t1.uid = t2.uid
這種情況下,一定要給A表的uid和did創建索引,如果uid值是唯一那就創建唯一所引UNIQUE;否則就創建normal索引。
基本上加索引之后,查詢速度立馬就秒級了。
有索引就像新華字典的目錄一樣按照a,b,c順序排好序,查找時速率才會高。
問題二:查詢語句,主表換了之后,也加了關聯字段的索引,結果還是很慢,就很奇怪,只是主表換了而已
問題二解決方案:原來是兩張表的字符集不一樣,B表utf8(3個字節)和表A utf8mb4(4個字節)字符集兼容問題。
select * from A left join B where A.id = B.id? ?A作為主表字符集包含B,可以很快查詢導數據
select * from B?left join A? where A.id = B.id? ?B作為主表則無法快速查詢到數據,因為B無法兼容4個字符的數據,只能全表掃描
索引和主鍵的區別
索引分為:主鍵索引(SPATAIL)、唯一索引(UNIQUE)、常規索引(NORMAL)和全文索引(FULLTEXT);
創建索引一般為
主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的
1.唯一性索引列允許空值,而主鍵列不允許為空值
2.主鍵列在創建時,已經默認為非空值 + 唯一索引了,在navicat中可能看不到,可以使用mysql查詢語句來查看#show index from 表名;
3.主鍵可以被其他表引用為外鍵,而唯一索引不能
4. 主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等
組合索引創建:
當我們的where查詢存在多個條件查詢的時候,我們需要對查詢的列創建組合索引
減少開銷:創建A B C 組合索引,相當于創建了(A)(A,B)(A,B,C)3個索引。?(a,b,c)多列索引和 (a,c,b)是不一樣的
覆蓋索引:查詢 select A,B,C from 表名 ,由于查詢的字段存在索引頁中,那么可以從索引中直接獲取,而不需要回表查詢。
組合索引的生效原則從前往后依次使用生效,如果中間某個索引沒有使用,那么斷點前面的索引部分起作用,斷點后面的索引沒有起作用;
where a=1 and b=2 and c=3 .... 這種三個索引順序使用中間沒有斷點,全部發揮作用; where a=3 and c=5... 這種情況下b就是斷點,a發揮了效果,c沒有效果 where b=3 and c=4... 這種情況下a就是斷點,在a后面的索引都沒有發揮作用,這種寫法聯合索引沒有發揮任何效果; where b=45 and a=3 and c=5 .... 這個跟第一個一樣,全部發揮作用,abc只要用上了就行,跟寫的順序無關?索引基本創建注意事項:
1. 索引不是越多越好,根據需要創建;對于重復數據的字段,沒必要創建索引
2.涉及到關聯表的一定要創建關聯字段的索引
3. 一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like “%aaa%” 不會使用索引而like “aaa%”可以使用索引
4.使用短索引。對字符列進行索引,盡可能指定長度。短索引,不僅可以提高查詢速度而且能節省磁盤空間
索引不生效的情況
1.?在索引字段上運算? where id-1=1 或者WHERE column(column)> 10;
2. 隱性轉換。字符和數值型
3.like “%aaa%”? "%aaa"不會使用索引而like “aaa%”可以使用索引
4.如果多個OR條件中有其中一個條件沒有索引,則必須進行全表索引
什么情況下適合建立索引?
一般來說,在WHERE和JOIN中出現的列需要建立索引。因為MySQL只對,>=,BETWEEN,IN,以及某些時候的LIKE才會使用索引。
索引缺點
1..雖然索引大大提高了查詢速度,同時會降低更新表的速度,如對表進行insert、update和delete。因為更新表時,不僅要保存數據,還要保存索引文件。
2.建立索引會占用磁盤空間的索引文件。如果你在一個大表上創建了多種組合索引,索引文件的會增長很快。
索引只是提高效率的一個因素,如果有大數據量的表,就需要花時間研究建立最優秀的索引,或優化查詢語句。
查看無效索引,清除無效索引?
查看索引是否生效:https://blog.csdn.net/u014470581/article/details/68065590
參考鏈接:https://www.cnblogs.com/yszr/p/10674729.html
總結
以上是生活随笔為你收集整理的mysql多数据表关联查询慢问题解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MPQ4420HGJ DCDC电源设计+
- 下一篇: 软件工程毕业论文mysql英文翻译_软件