久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

優(yōu)化MySQL的技巧有哪些

共計(jì) 2403 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。

自動(dòng)寫(xiě)代碼機(jī)器人,免費(fèi)開(kāi)通

這篇文章主要介紹優(yōu)化 MySQL 的技巧有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

SQL 執(zhí)行慢的原因

網(wǎng)絡(luò)速度慢,內(nèi)存不足,I/ O 吞吐量小,磁盤(pán)空間滿了等硬件問(wèn)題

沒(méi)有索引或者索引失效

數(shù)據(jù)表里的數(shù)據(jù)記錄過(guò)多

服務(wù)器調(diào)優(yōu)及各個(gè)參數(shù)設(shè)置也可能會(huì)影響

開(kāi)發(fā)者編寫(xiě)的 SQL 效率

其他

1、EXPLAIN 分析你的 SELECT 查詢(xún)

很多情況下,使用 EXPLAIN 關(guān)鍵字可以讓你知道 MySQL 是如何處理你的 SQL 語(yǔ)句的,這可以幫你分析你的查詢(xún)語(yǔ)句,從而或許能盡快的找到優(yōu)化方法以及潛在的性能問(wèn)題。具體 EXPLAIN 的使用以及各個(gè)參數(shù)的含義,請(qǐng)查閱相關(guān)文檔即可。

2、SELECT 查詢(xún)必須指明字段名

SELECT * 的查詢(xún)會(huì)加很多不必要的消耗(例如 CPU、I/ O 等),同時(shí),也有可能增加了使用覆蓋索引。所以 SELECT 查詢(xún)時(shí),要求直接在后面指明需要查詢(xún)的對(duì)應(yīng)字段名。

3、查詢(xún)一條數(shù)據(jù)的時(shí)候,使用 LIMIT 1

減少多余的查詢(xún),因?yàn)橹付?limit 1 后,查詢(xún)到一條數(shù)據(jù)就不再繼續(xù)查詢(xún)了,使得 EXPLAIN 中 type 列達(dá)到 const 類(lèi)型,查詢(xún)語(yǔ)句更優(yōu)。

4、為搜索的 WHERE 字段建立索引

一般,每個(gè)表我們都會(huì)設(shè)置一個(gè)主鍵,而索引并不一定就是給主鍵。如果在你的表中,有某個(gè)字段你總要會(huì)經(jīng)常用來(lái)做 WHERE 查詢(xún)搜索,而且是讀大于寫(xiě)的,那么,請(qǐng)為其建立索引吧,有興趣了解更多建立索引的的原則,可以查閱相關(guān)資料。

5、千萬(wàn)不要使用 ORDER BY RAND()

如果你想隨機(jī)取數(shù)據(jù),也許第一個(gè)直接會(huì)告訴你,用隨機(jī)數(shù)取,切記,這個(gè)時(shí)候你必須控制你的大腦在這個(gè)方向繼續(xù)想下去,趕緊停止這種可怕的想法。因?yàn)檫@種查詢(xún),對(duì)數(shù)據(jù)庫(kù)的性能毫無(wú)益處(消耗 CPU)。更好的方案之一是先找到數(shù)據(jù)所在的條數(shù) N,然后再用 LIMIT N, 1 這樣查詢(xún)。

6、保證每張表都有一個(gè)主鍵 ID

我們應(yīng)該養(yǎng)成一種習(xí)慣,每設(shè)計(jì)新建一張表的時(shí)候,都應(yīng)該為其設(shè)計(jì)一個(gè) ID 字段,并讓其成為主鍵,而且最好是 INT 型(也有使用 UUID 的),同時(shí)設(shè)置這個(gè) ID 字段為自增(AUTO_INCREMENT)的標(biāo)志。

8、盡可能的使用 NOT NULL

不要以為 NULL 不需要空間,事實(shí)是 NULL 也需要額外的空間,也許,很多有沒(méi)注意但是遇到過(guò),NULL 字段在進(jìn)行查詢(xún)比較的時(shí)候,是比較麻煩的。當(dāng)然了,如果你實(shí)在是必須需要 NULL 的話,那沒(méi)轍,就使用吧,否則的話,就建議使用 NOT NULL 吧。

8、選擇合適的存儲(chǔ)引擎

在 MySQL 中有 MyISAM 和 InnoDB 兩種存儲(chǔ)引擎,兩者各有利弊,所以我們需要了解兩者的差異然后來(lái)做出最合適的選擇,例如 InnoDB 支持事務(wù)而 MyISAM 不支持,MyISAM 查詢(xún)比 InnoDB 快等等;總之,如果你不知道選擇什么的話,那就用 InnoDB 吧。

9、把 IP 地址存為 UNSIGNED INT

在遇到需要存儲(chǔ) IP 地址的時(shí)候,很多人的第一想法都會(huì)是存儲(chǔ) VARCHAR(15) 字符串類(lèi)型的,而不會(huì)想到要用 INT 整型來(lái)存儲(chǔ);如果你用整型來(lái)存儲(chǔ),只需要 4 個(gè)字節(jié),并且你可以有定長(zhǎng)的字段,而且這會(huì)為你帶來(lái)查詢(xún)上的優(yōu)勢(shì)。

10、盡量不要在 WHERE 查詢(xún)時(shí)對(duì)字段進(jìn)行 null 值判斷

我們都知道,檔我們對(duì)一個(gè)字段進(jìn)行 null 的判斷時(shí)候,會(huì)比較慢的,這是因?yàn)檫@個(gè)判斷會(huì)導(dǎo)致引擎放棄使用所有已有的索引而進(jìn)行全表掃描搜索。

11、盡量不要使用 % 前綴的 LIKE 模糊查詢(xún)

模糊查詢(xún),在日常開(kāi)發(fā)中,我們都會(huì)經(jīng)常遇到,但是我相信很多人都是直接 LIKE %key_word% 或者 LIKE %key_word 這樣搜索的,這兩種搜索方式,都會(huì)導(dǎo)致索引失效從而進(jìn)行全表掃描搜索。如果解決上面的這種模糊查詢(xún)呢,答案就是使用“使用全文索引”,具體的用法有興趣的可以自己查資料一波。

12、避免在 WHERE 查詢(xún)時(shí)對(duì)字段進(jìn)行表達(dá)式操作

例如查詢(xún)語(yǔ)句 SELECT id FROM table WHERE num * 2 = 50;,這樣的查詢(xún),對(duì)字段 num 做了一個(gè)乘 2 的算數(shù)操作,就會(huì)導(dǎo)致索引失效。

14、減少不必要的排序

排序操作會(huì)消耗較多的 CPU 資源,所以減少不必要的排序可以在緩存命中率高等 I / O 足夠的情況下,會(huì)降低 SQL 的響應(yīng)時(shí)間。

14、建議用 JOIN 代替子查詢(xún)

有的人會(huì)說(shuō),JOIN 的性能其實(shí)也并不是很好呀,但是和子查詢(xún)比起來(lái)還是有很大的性能優(yōu)勢(shì)的。具體的,可以了解一下子查詢(xún)的執(zhí)行計(jì)劃相關(guān)的問(wèn)題。

15、避免發(fā)生隱式類(lèi)型轉(zhuǎn)換

類(lèi)型轉(zhuǎn)換主要是指在 WHERE 子句中出現(xiàn)字段的類(lèi)型和傳入的參數(shù)類(lèi)型不一致的時(shí)候發(fā)生的類(lèi)型轉(zhuǎn)換;這是因?yàn)槿绻覀儌魅氲臄?shù)據(jù)類(lèi)型和字段類(lèi)型不一致,MySQL 可能會(huì)對(duì)我們傳的數(shù)據(jù)進(jìn)行類(lèi)型轉(zhuǎn)換操作,也可能不進(jìn)行處理而直接交由存儲(chǔ)引擎去處理,這樣一來(lái),就可能會(huì)出現(xiàn)索引無(wú)法使用的情況而造成執(zhí)行計(jì)劃問(wèn)題。

16、避免多表查詢(xún)字段類(lèi)型不一致

在遇到需要多表聯(lián)合查詢(xún)的時(shí)候,我們?cè)O(shè)計(jì)表結(jié)構(gòu)的時(shí)候,盡量保持表與表的關(guān)聯(lián)字段一致,并且都要設(shè)置索引。同時(shí),多表連接查詢(xún)時(shí),盡量把結(jié)果集小的表作為驅(qū)動(dòng)表。

17、建議開(kāi)啟查詢(xún)緩存

大多數(shù)的 MySQL 服務(wù)器都開(kāi)啟了查詢(xún)緩存,這是提高性能最有效的方法之一,因?yàn)椴樵?xún)緩存由 MySQL 數(shù)據(jù)庫(kù)引擎自動(dòng)處理,當(dāng)有很多相同的查詢(xún)被執(zhí)行了多次的時(shí)候,這些查詢(xún)結(jié)果會(huì)被放到一個(gè)緩存中,這樣,后續(xù)的相同的查詢(xún)就不用操作表,而直接訪問(wèn)緩存結(jié)果了。

18、使用 UNION 代替臨時(shí)表

UNION 查詢(xún)可以把兩條或更多的 SELECT 查詢(xún)結(jié)果合并到一個(gè)查詢(xún)中,從而不再需要?jiǎng)?chuàng)建臨時(shí)表來(lái)完成。需要注意的是,使用 UNION 的所有 SELECT 語(yǔ)句中的字段數(shù)目要相同。

19、慎用 IN 查詢(xún)

IN 以及 NOT IN 查詢(xún)都要慎重,因?yàn)榭赡軙?huì)導(dǎo)致全表掃描,而對(duì)于連續(xù)的數(shù)值,能用 BETWEEN 就不要用 IN 了。

以上是“優(yōu)化 MySQL 的技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!

向 AI 問(wèn)一下細(xì)節(jié)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-16發(fā)表,共計(jì)2403字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 紫金县| 连山| 黔西| 墨脱县| 凭祥市| 牡丹江市| 苍山县| 威宁| 盱眙县| 深泽县| 阿瓦提县| 长宁区| 宿州市| 嫩江县| 搜索| 博湖县| 南召县| 徐州市| 白沙| 北流市| 泰和县| 武乡县| 罗甸县| 莲花县| 静乐县| 青田县| 墨玉县| 凤阳县| 丰城市| 资兴市| 噶尔县| 会同县| 四川省| 东丰县| 永宁县| 开远市| 伊通| 油尖旺区| 新营市| 甘泉县| 肇庆市|