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); // 數組類型