1
、选取最适用的字段属性
,
尽可能减少定义字段长度
,
尽量把字段设置
NOT NULL,
例如
'
省份
,
性别
',
最好设置为
ENUM
2 、使用连接( JOIN )来代替子查询 :
a. 删除没有任何订单客户 :DELETE FROM customerinfo WHERE customerid NOTin(SELECT customerid FROM orderinfo)
b. 提取所有没有订单客户 :SELECT FROM customerinfo WHERE customerid NOTin(SELECT customerid FROM orderinfo)
c. 提高 b 的速度优化 :SELECT FROM customerinfo LEFT JOIN orderidcustomerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3 、使用联合 (UNION) 来代替手动创建的临时表
a. 创建临时表 :SELECT name FROM `nametest` UNION SELECTusername FROM `nametest2`
4 、事务处理 :
a. 保证数据完整性 , 例如添加和修改同时 , 两者成立则都执行 , 一者失败都失败
mysql_query("BEGIN");
mysql_query("INSERT INTOcustomerinfo (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 TABLEcustomerinfo READ, orderinfo WRITE");
mysql_query("SELECT customeridFROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo`SET ordertitle='$title' where customerid=".$id);
mysql_query("UNLOCKTABLES");
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,
PRIMARYKEY(customerid,orderid),
FOREIGN KEY (customerid)REFERENCES customerinfo
(customerid) ON DELETECASCADE
)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 WHEREYEAR(orderDate)<2008;( 慢 )
SELECT * FROM order WHEREorderDate<"2008-01-01";( 快 )
例子 2:
SELECT * FROM order WHEREaddtime/7<24;( 慢 )
SELECT * FROM order WHEREaddtime<24*7;( 快 )
例子 3:
SELECT * FROM order WHERE title like"%good%";
SELECT * FROM order WHEREtitle>="good" and name<"good";
2 、使用连接( JOIN )来代替子查询 :
a. 删除没有任何订单客户 :DELETE FROM customerinfo WHERE customerid NOTin(SELECT customerid FROM orderinfo)
b. 提取所有没有订单客户 :SELECT FROM customerinfo WHERE customerid NOTin(SELECT customerid FROM orderinfo)
c. 提高 b 的速度优化 :SELECT FROM customerinfo LEFT JOIN orderidcustomerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
3 、使用联合 (UNION) 来代替手动创建的临时表
a. 创建临时表 :SELECT name FROM `nametest` UNION SELECTusername FROM `nametest2`
4 、事务处理 :
a. 保证数据完整性 , 例如添加和修改同时 , 两者成立则都执行 , 一者失败都失败
mysql_query("BEGIN");
mysql_query("INSERT INTOcustomerinfo (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 TABLEcustomerinfo READ, orderinfo WRITE");
mysql_query("SELECT customeridFROM `customerinfo` where id=".$id);
mysql_query("UPDATE `orderinfo`SET ordertitle='$title' where customerid=".$id);
mysql_query("UNLOCKTABLES");
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,
PRIMARYKEY(customerid,orderid),
FOREIGN KEY (customerid)REFERENCES customerinfo
(customerid) ON DELETECASCADE
)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 WHEREYEAR(orderDate)<2008;( 慢 )
SELECT * FROM order WHEREorderDate<"2008-01-01";( 快 )
例子 2:
SELECT * FROM order WHEREaddtime/7<24;( 慢 )
SELECT * FROM order WHEREaddtime<24*7;( 快 )
例子 3:
SELECT * FROM order WHERE title like"%good%";
SELECT * FROM order WHEREtitle>="good" and name<"good";