❶ 8,mysql資料庫,怎麼優化

優化Mysql資料庫的8個方法
1、創建索引
對於查詢佔主要的應用來說,索引顯得尤為重要。很多時候性能問題很簡單的就是因為我們忘了添加索引而造成的,或者說沒有添加更為有效的索引導致。如果不加索引的話,那麼查找任何哪怕只是一條特定的數據都會進行一次全表掃描,如果一張表的數據量很大而符合條件的結果又很少,那麼不加索引會引起致命的性能下降。但是也不是什麼情況都非得建索引不可,比如性別可能就只有兩個值,建索引不僅沒什麼優勢,還會影響到更新速度,這被稱為過度索引。
2、復合索引
比如有一條語句是這樣的:select
* from users where area='beijing' and
age=22;
如果我們是在area和age上分別創建單個索引的話,由於mysql查詢每次只能使用一個索引,所以雖然這樣已經相對不做索引時全表掃描提高了很多效率,但是如果在area、age兩列上創建復合索引的話將帶來更高的效率。如果我們創建了(area,
age,
salary)的復合索引,那麼其實相當於創建了(area,age,salary)、(area,age)、(area)三個索引,這被稱為最佳左前綴特性。因此我們在創建復合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。
3、索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那麼這一列對於此復合索引就是無效的。所以我們在資料庫設計時不要讓欄位的默認值為NULL。
4、使用短索引
對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的
列,如果在前10 個或20
個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和I/O操作。
5、排序的索引問題
mysql查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order
by中的列是不會使用索引的。因此資料庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創建復合索引。
6、like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like
「%aaa%」 不會使用索引而like 「aaa%」可以使用索引。
7、不要在列上進行運算
select *
from users where
YEAR(adddate)<2007;
將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成
select * from
users where adddate<『2007-01-01';
8、不使用NOT
IN和<>操作
NOT IN和<>操作都不會使用索引將進行全表掃描。NOT IN可以NOT
EXISTS代替,id<>3則可使用id>3 or id<3來代替。

❷ 優化MYSQL資料庫的方法

(1).資料庫設計方面,這是DBA和Architect的責任,設計結構良好的資料庫,必要的時候,去正規化(英文是這個:denormalize,中文翻譯成啥我不知道),允許部分數據冗餘,避免JOIN操作,以提高查詢效率
(2).系統架構設計方面,表散列,把海量數據散列到幾個不同的表裡面.快慢表,快表只留最新數據,慢表是歷史存檔.集群,主伺服器Read & write,從伺服器read only,或者N台伺服器,各機器互為Master
(3).(1)和(2)超越PHP Programmer的要求了,會更好,不會沒關系.檢查有沒有少加索引
(4).寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛卡爾積的全連接啊,大量的Group By和order by,沒有limit等等.必要的時候,把資料庫邏輯封裝到DBMS端的存儲過程裡面.緩存查詢結果,explain每一個sql語句
(5).所得皆必須,只從資料庫取必需的數據,比如查詢某篇文章的評論數,select count(*) ... where article_id = ? 就可以了,不要先select * ... where article_id = ?然後msql_num_rows.
只傳送必須的SQL語句,比如修改文章的時候,如果用戶只修改了標題,那就update ... set title = ? where article_id = ?不要set content = ?(大文本)
(6).必要的時候用不同的存儲引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量級的查詢速度

❸ 怎麼進行mysql資料庫優化

主要從以下角度思考優化方向:1,Mysql配置優化主要對查詢緩存,mysql資料庫連接時長,開啟慢查詢日誌(開啟後還要分析sql)等方面進行優化2. Myslq語句優化3. Mysql索引優化主要是需要注意索引數量和索引失效情況,重復索引4. Mysql引擎優化innodb引擎注重於事務,能保證數據一致性myisam引擎可以進行全文檢索,但不是事務安全當初在黑馬程序員學過,還用實例進行優化學習。

❹ Mysql資料庫優化可以從哪幾個方面優化

MRR 是 MySQL 針對特定查詢的一種優化手段。假設一個查詢有二級索引可用,讀完二級索引後要回表才回能查到那些不在當前答二級索引上的列值,由於二級索引上引用的主鍵值不一定是有序的,因此就有可能造成大量的隨機 IO,如果回表前把主鍵值給它排一下序,那麼在回表的時候就可以用順序 IO 取代原本的隨機 IO。
如果想關閉 MRR 優化的話,就要把優化器開關 mrr 設置為 off。
默認只有在優化器認為 MRR 可以帶來優化的情況下才會走 MRR,如果你想不管什麼時候能走 MRR 的都走 MRR 的話,你要把 mrr_cost_based 設置為 off,不過最好不要這么干,因為這確實是一個坑,MRR 不一定什麼時候都好,全表掃描有時候會更加快,如果在這種場景下走 MRR 就完成了。
MRR 要把主鍵排個序,這樣之後對磁碟的操作就是由順序讀代替之前的隨機讀。從資源的使用情況上來看就是讓 CPU 和內存多做點事,來換磁碟的順序讀。然而排序是需要內存的,這塊內存的大小就由參數 read_rnd_buffer_size 來控制。

❺ 怎麼實現 MySQL資料庫性能優化 舉例說明

在mysql安裝目錄下,比如:
D:\Program
Files\MySQL\MySQL
Server
5.1
裡面有幾個配置文件,只要修改名字成為
my.ini
即可,比如:
my-huge.ini
巨型伺服器
my-large.ini
大型
my-medium.ini
中型
my-small.ini
小型
備份原來的,並重命名,重新啟動即可。其中,[mysqld]
這一節是mysql伺服器的配置信息。

❻ 如何優化mysql資料庫

。從外在條件來說,優化mysql涉及優化硬體、優化磁碟、優化操作系統、選擇應用編程介面等。
二、優化硬體
如果你需要龐大的資料庫表(2G),你應該考慮使用64位的硬體結構,像Alpha、Sparc或即將推出的IA64。因為MySQL內部使用大量64位的整數,64位的CPU將提供更好的性能。
大數據庫,優化的次序一般是RAM、快速硬碟、CPU能力。
更多的內存通過將最常用的鍵碼頁面存放在內存中可以加速鍵碼的更新。
如果不使用事務安全(transaction-safe)的表或有大表並且想避免長文件檢查,一台UPS就能夠在電源故障時讓系統安全關閉。
對於資料庫存放在一個專用伺服器的系統,應該考慮1G的乙太網。延遲與吞吐量同樣重要。

❼ mysql資料庫怎麼優化,有幾方面的優化

我列舉幾個我熟悉的,
1,存儲引擎,根據應用選擇合適的引擎
2,索引
----這個內就有很多文章了,容具體需要你自己去了解
3,sql語句優化,查詢條件的選擇之類
4,mysql自身系統配置,需要針對應用去定製
5,表的選擇,臨時表,或者分區表,也需要針對應用的情況去選擇使用

❽ MySQL資料庫性能優化有哪些技巧

1.存儲引擎的選擇如果數據表需要事務處理,應該考慮使用InnoDB,因為它完全符合ACID特性。如果不需要事務處理,使用默認存儲引擎MyISAM是比較明智的。並且不要嘗試同時使用這兩個存儲引擎。思考一下:在一個事務處理中,一些數據表使用InnoDB,而其餘的使用MyISAM.結果呢?整個subject將被取消,只有那些在事務處理中的被帶回到原始狀態,其餘的被提交的數據轉存,這將導致整個資料庫的沖突。然而存在一個簡單的方法可以同時利用兩個存儲引擎的優勢。目前大多數MySQL套件中包括InnoDB、編譯器和鏈表,但如果你選擇MyISAM,你仍然可以單獨下載InnoDB,並把它作為一個插件。很簡單的方法,不是嗎?
2.計數問題如果數據表採用的存儲引擎支持事務處理(如InnoDB),你就不應使用COUNT(*)計算數據表中的行數。這是因為在產品類資料庫使用COUNT(*),最多返回一個近似值,因為在某個特定時間,總有一些事務處理正在運行。如果使用COUNT(*)顯然會產生bug,出現這種錯誤結果。
3.反復測試查詢查詢最棘手的問題並不是無論怎樣小心總會出現錯誤,並導致bug出現。恰恰相反,問題是在大多數情況下bug出現時,應用程序或資料庫已經上線。的確不存在針對該問題切實可行的解決方法,除非將測試樣本在應用程序或資料庫上運行。任何資料庫查詢只有經過上千個記錄的大量樣本測試,才能被認可。
4.避免全表掃描通常情況下,如果MySQL(或者其他關系資料庫模型)需要在數據表中搜索或掃描任意特定記錄時,就會用到全表掃描。此外,通常最簡單的方法是使用索引表,以解決全表掃描引起的低效能問題。然而,正如我們在隨後的問題中看到的,這存在錯誤部分。
5.使用「EXPLAIN」進行查詢當需要調試時,EXPLAIN是一個很好的命令,下面將對EXPLAIN進行深入探討。

❾ 怎麼優化MySQL資料庫

1、選取最適用的欄位屬性,盡可能減少定義欄位長度,盡量把欄位設置NOT NULL,例如'省份,性別',最好設置為ENUM
2、使用連接(JOIN)來代替子查詢:
a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3、使用聯合(UNION)來代替手動創建的臨時表
a.創建臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事務處理:
a.保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
5、鎖定表,優化事務處理:
a.我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,
不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id);
mysql_query("UNLOCK TABLES");
6、使用外鍵,優化鎖定表
a.把customerinfo里的customerid映射到orderinfo里的customerid,
任何一條沒有合法的customerid的記錄不會寫到orderinfo里
CREATE TABLE customerinfo
(
customerid INT NOT NULL,
PRIMARY KEY(customerid)
)TYPE = INNODB;
CREATE TABLE orderinfo
(
orderid INT NOT NULL,
customerid INT NOT NULL,
PRIMARY KEY(customerid,orderid),
FOREIGN KEY (customerid) REFERENCES customerinfo
(customerid) ON DELETE CASCADE
)TYPE = INNODB;
注意:'ON DELETE CASCADE',該參數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order
表中的該用戶的所有記錄,注意使用外鍵要定義事務安全類型為INNODB;
7、建立索引:
a.格式:
(普通索引)->
創建:CREATE INDEX <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引欄位))
(唯一索引)->
創建:CREATE UNIQUE <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引欄位))
(主鍵)->
它是唯一索引,一般在創建表是建立,格式為:
CREATA TABLE tablename ([...],PRIMARY KEY[索引欄位])
8、優化查詢語句
a.最好在相同欄位進行比較操作,在建立好的索引欄位上盡量減少函數操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";

❿ 優化MYSQL資料庫的方法

1、選取最適用的欄位屬性,盡可能減少定義欄位長度,盡量把欄位設置NOT NULL,例如'省份,性別',最好設置為ENUM
2、使用連接(JOIN)來代替子查詢:
a.刪除沒有任何訂單客戶:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
b.提取所有沒有訂單客戶:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
c.提高b的速度優化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3、使用聯合(UNION)來代替手動創建的臨時表
a.創建臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4、事務處理:
a.保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗
mysql_query("BEGIN");
mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
mysql_query("COMMIT");
5、鎖定表,優化事務處理:
a.我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。
包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,
不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作
mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id);
mysql_query("UNLOCK TABLES");
6、使用外鍵,優化鎖定表
a.把customerinfo里的customerid映射到orderinfo里的customerid,
任何一條沒有合法的customerid的記錄不會寫到orderinfo里
CREATE TABLE customerinfo
(
customerid INT NOT NULL,
PRIMARY KEY(customerid)
)TYPE = INNODB;
CREATE TABLE orderinfo
(
orderid INT NOT NULL,
customerid INT NOT NULL,
PRIMARY KEY(customerid,orderid),
FOREIGN KEY (customerid) REFERENCES customerinfo
(customerid) ON DELETE CASCADE
)TYPE = INNODB;
注意:'ON DELETE CASCADE',該參數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order
表中的該用戶的所有記錄,注意使用外鍵要定義事務安全類型為INNODB;
7、建立索引:
a.格式:
(普通索引)->
創建:CREATE INDEX <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引欄位))
(唯一索引)->
創建:CREATE UNIQUE <索引名> ON tablename (索引欄位)
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引欄位)
創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引欄位))
(主鍵)->
它是唯一索引,一般在創建表是建立,格式為:
CREATA TABLE tablename ([...],PRIMARY KEY[索引欄位])
8、優化查詢語句
a.最好在相同欄位進行比較操作,在建立好的索引欄位上盡量減少函數操作
例子1:
SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢)
SELECT * FROM order WHERE orderDate<"2008-01-01";(快)
例子2:
SELECT * FROM order WHERE addtime/7<24;(慢)
SELECT * FROM order WHERE addtime<24*7;(快)
例子3:
SELECT * FROM order WHERE title like "%good%";
SELECT * FROM order WHERE title>="good" and name<"good";