MySQL數(shù)據(jù)庫(kù)優(yōu)化的六種方式總結(jié)
方法一
使用連接來代替子查詢(Sub-Queries)??梢允褂肧ELECT語(yǔ)句來創(chuàng)建一個(gè)單列的查詢結(jié)果,然后把這個(gè)結(jié)果作為過濾條件用在另一個(gè)查詢中。
DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT customerid FROM salesinfo)
方法二
事務(wù)。不是所有的數(shù)據(jù)庫(kù)操作都可以只用一條或少數(shù)幾條SQL語(yǔ)句就可以完成的。更多的時(shí)候是需要用到一系列的語(yǔ)句來完成某種工作。可以保持?jǐn)?shù)據(jù)庫(kù)中數(shù)據(jù)的完整性和一致性
BEGIN; INSERT INTO salesinfo SET customerid=14; UPDATE inventory SET quantity =11 WHERE item='book'; COMMIT;
方法三
鎖定表。由于在事務(wù)執(zhí)行的過程中,數(shù)據(jù)庫(kù)將會(huì)被鎖定,因此其他的用戶請(qǐng)求只能暫時(shí)等待直到該事務(wù)結(jié)束。有些情況下我們可以通過鎖定表的放大來獲得更好的性能。
LOCK TABLE inventory WRITE SELECT quantity FROM inventory WHERE Item='book'; ... UPDATE inventory SET Quantity=11 WHERE Item='book';UNLOCKTABLES
方法四
使用外鍵。鎖定表的方法可以保護(hù)數(shù)據(jù)的完整性,但是卻不能保證數(shù)據(jù)的關(guān)聯(lián)性。
CREATE TABLE customerinfo( customerid int primary key) engine = innodb; CREATE TABLE salesinfo( salesid int not null,customerid int not null, primary key(customerid,salesid),foreign key(customerid) references customerinfo(customerid) on delete cascade)engine = innodb;
方法五
使用索引。
索引是提高數(shù)據(jù)庫(kù)性能的常用方法,它可以令數(shù)據(jù)庫(kù)服務(wù)器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語(yǔ)句當(dāng)中包含有MAX(),MIN()和ORDERBY這些命令的時(shí)候,性能提高更為明顯。
那該對(duì)哪些字段建立索引呢?
一般說來,索引應(yīng)建立在那些將用于JOIN,WHERE判斷和ORDERBY排序的字段上。盡量不要對(duì)數(shù)據(jù)庫(kù)中某個(gè)含有大量重復(fù)的值的字段建立索引。對(duì)于一個(gè)ENUM類型的字段來說,出現(xiàn)大量重復(fù)值是很有可能的情況
例如customerinfo中的“province”…字段,在這樣的字段上建立索引將不會(huì)有什么幫助;相反,還有可能降低數(shù)據(jù)庫(kù)的性能。我們?cè)趧?chuàng)建表的時(shí)候可以同時(shí)創(chuàng)建合適的索引,也可以使用ALTERTABLE或CREATEINDEX在以后創(chuàng)建索引。此外,MySQL從版本3.23.23開始支持全文索引和搜索。全文索引在MySQL中是一個(gè)FULLTEXT類型索引,但僅能用于MyISAM類型的表。對(duì)于一個(gè)大的數(shù)據(jù)庫(kù),將數(shù)據(jù)裝載到一個(gè)沒有FULLTEXT索引的表中,然后再使用ALTERTABLE或CREATEINDEX創(chuàng)建索引,將是非??斓摹5绻麑?shù)據(jù)裝載到一個(gè)已經(jīng)有FULLTEXT索引的表中,執(zhí)行過程將會(huì)非常慢。
方法六
選取最適用的字段屬性。MySQL可以支持大數(shù)據(jù)量的存取,但是數(shù)據(jù)庫(kù)中的表越小,在上面執(zhí)行的查詢就越快。所以可以將表中的字段寬度設(shè)置的盡可能小
附:mysql優(yōu)化的常用方法
1.索引的優(yōu)化
- 只要列中含有NULL值,就最好不要在此例設(shè)置索引,復(fù)合索引如果有NULL值,此列在使用時(shí)也不會(huì)使用索引
- 盡量使用短索引,如果可以,應(yīng)該制定一個(gè)前綴長(zhǎng)度
- 對(duì)于經(jīng)常在where子句使用的列,最好設(shè)置索引,這樣會(huì)加快查找速度
- 對(duì)于有多個(gè)列where或者order by子句的,應(yīng)該建立復(fù)合索引
- 對(duì)于like語(yǔ)句,以%或者‘-’開頭的不會(huì)使用索引,以%結(jié)尾會(huì)使用索引
- 盡量不要在列上進(jìn)行運(yùn)算(函數(shù)操作和表達(dá)式操作)
- 盡量不要使用not in和<>操作
2.sql語(yǔ)句的優(yōu)化
- 查詢時(shí),能不要*就不用*,盡量寫全字段名
- 大部分情況連接效率遠(yuǎn)大于子查詢
- 多使用explain和profile分析查詢語(yǔ)句
- 查看慢查詢?nèi)罩?,找出?zhí)行時(shí)間長(zhǎng)的sql語(yǔ)句優(yōu)化
- 多表連接時(shí),盡量小表驅(qū)動(dòng)大表,即小表 join 大表
- 在千萬(wàn)級(jí)分頁(yè)時(shí)使用limit
- 對(duì)于經(jīng)常使用的查詢,可以開啟緩存
3.表的優(yōu)化
- 表的字段盡可能用NOT NULL
- 字段長(zhǎng)度固定的表查詢會(huì)更快
- 把數(shù)據(jù)庫(kù)的大表按時(shí)間或一些標(biāo)志分成小表
- 將表分區(qū)
總結(jié)
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)優(yōu)化的六種方式的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫(kù)優(yōu)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Can''t connect to MySQL server的解決辦法
ERROR 2003 (HY000): Can't connect to MySQL server on '*.*.*.*' (113)的解決辦法2010-06-06Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01MySQL 替換某字段內(nèi)部分內(nèi)容的UPDATE語(yǔ)句
至于字段內(nèi)部分內(nèi)容:比如替換標(biāo)題里面的產(chǎn)品價(jià)格,接下來為你詳細(xì)介紹下UPDATE語(yǔ)句的寫法,感興趣的你可以參考下哈,希望可以幫助到你2013-03-03MYSQL中varchar和TEXT的相關(guān)問題詳析
varchar 和 text 是 MySQL 字符存儲(chǔ)爭(zhēng)議比較多的領(lǐng)域,下面這篇文章主要給大家介紹了關(guān)于MYSQL中varchar和TEXT,文中介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12mysql 5.7.15 安裝配置方法圖文教程(windows)
這篇文章主要為大家詳細(xì)介紹了mysql 5.7.15 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07C#如何在海量數(shù)據(jù)下的高效讀取寫入MySQL
這篇文章主要介紹了C#如何在海量數(shù)據(jù)下的高效讀取寫入MySQL的相關(guān)資料,需要的朋友可以參考下2016-12-12