程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 優化MYSQL數據庫的方法,優化mysql數據庫

優化MYSQL數據庫的方法,優化mysql數據庫

編輯:MySQL綜合教程

優化MYSQL數據庫的方法,優化mysql數據庫


1、選取最適用的字段屬性

  盡可能減少定義字段長度,盡量把字段設置NOT NULL,例如'省份,性別',最好設置為ENUM 

2、使用連接(JOIN)來代替子查詢: 

   a、刪除沒有任何訂單客戶  

  ELETE 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)來代替手動創建的臨時表 

  創建臨時表:  

  SELECT name FROM `nametest` UNION SELECT username FROM `nametest2` 

4、事務處理: 

  保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗 

  mysql_query("BEGIN"); 

  mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')"; 

  mysql_query("SELECT * FROM `orderinfo` where customerid=".$id"); 

  mysql_query("COMMIT"); 

5、鎖定表,優化事務處理  

  我們用一個 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、使用外鍵,優化鎖定表 

  把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[索引名](索引字段))  

  b、(唯一索引)-> 

  創建:CREATE UNIQUE <索引名> ON tablename (索引字段) 

  修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段) 

  創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段))  

  c、(主鍵索引)-> 

  它是唯一索引,一般在創建表是建立,格式為: 

  CREATA TABLE tablename ([...],PRIMARY KEY[索引字段]) 

8、優化查詢語句 

  最好在相同字段進行比較操作,在建立好的索引字段上盡量減少函數操作 

  a、例子1: 

  SELECT * FROM order WHERE YEAR(orderDate)<2008;(慢) 

  SELECT * FROM order WHERE orderDate<"2008-01-01";(快) 

  b、例子2: 

  SELECT * FROM order WHERE addtime/7<24;(慢) 

  SELECT * FROM order WHERE addtime<24*7;(快) 

  c、例子3: 

  SELECT * FROM order WHERE title like "%good%"; 

  SELECT * FROM order WHERE title>="good" and name<"good"; 

9、MySQL函數小結

  a、MYSQL取得當前時間的函數是?

  now()

  b、格式化日期的函數是?

  date() 

  c、自動 插入當前時間 ?

  將列屬性設置為 “TIMESTAMP”,設置其 default 為 “CURRENT_TIMESTAMP”。但是其只對“TIMESTAMP"有效。

  d、mysql_fetch_row() 和mysql_fetch_array之間有什麼區別?

  mysql_fetch_row是從結果集取出1行數組,作為枚舉 

  mysql_fetch_array是從結果集取出一行數組作為關聯數組,或數字數組,兩者兼得 

  e、取得查詢結果集總數的函數是?

  mysql_num_rows($result);

10、寫出三種以上MySQL數據庫存儲引擎的名稱

  MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十幾個引擎

11、MySQL數據庫基本的三個優化法則是什麼,除了增加硬件和帶寬?

  (提示:從服務配置、應用、開發角度考慮)

  (1)系統服務優化,把MySQL的key_buffer、cache_buffer、query_cache等增加容量

  (2)給所有經常查詢的字段增加適當的索引

  (3)優化SQL語句,減少Ditinct、Group、Join等等語句的操作

12、優化MYSQL數據庫的方法

  (1).選取最適用的字段屬性,應該盡量把字段設置為NOT NULL,這樣在將來執行查詢的時候,數據庫不用去比較NULL值。

  (2).使用連接(JOIN)來代替子查詢(Sub-Queries)

  (3).使用聯合(UNION)來代替手動創建的臨時表

  (4).盡量少使用 LIKE 關鍵字和通配符

  (5).使用事務和外鍵

13、對於大流量的網站,采用什麼樣的方法來解決訪問量問題?

  首先,確認服務器硬件是否足夠支持當前的流量

  其次,優化數據庫訪問。

  第三,禁止外部的盜鏈。

  第四,控制大文件的下載。

  第五,使用不同主機分流主要流量

  第六,使用流量分析統計軟件。

14、請簡述數據庫設計的范式及應用

  一般第3范式就足以,用於表結構的優化,這樣做既可以避免應用程序過於復雜同時也避免了SQL語句過於龐大所造成系統效率低下。

  第一范式:若關系模式R的每一個屬性是不可再分解的,再屬於第一范式。

  第二范式:若R屬於第一范式,且所有的非碼屬性都完全函數依賴於碼屬性,則為第二范式。

  第三范式:若R屬於第二范式,且所有的非碼屬性沒有一個是傳遞函數依賴於候選碼,則屬於第三范式。

15、連接數據庫操作的步驟是什麼?每一步的返回值是什麼數據類型?

  $coon = mysql_connect('localhost', 'root' ,''); //返回資源類型

  mysql_select_db('bbs', $coon);        // 布爾類型

  mysq_query('set names utf8');  //布爾類型

  $qry = mysql_query('select * from bbsinfo');  // 資源類型

  mysql_fetch_row($qry);        // 數組類型

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved