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) ;
提高b的优化速度:SELECT FROM customerinfo LEFT JOIN orderinfo 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 customerid 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(customerid, orderid),
FOREIGN customerid REFERENCES customerinfo(customerid) ON DELETE CASCADE
) TYPE=INNODB;
注意:‘ON DELETE CASCADE’该参数保证当customerinfo表中的一条记录删除的话同时也会删除orderinfo表中的该用户所有记录,注意定义外键要定义事务安全类型为INNODB.
7.建立索引
a.格式:
普通索引:
创建:CREATE INDEX ON tablename(索引字段)
修改:ALTER TABLE tablename ADD INDEX[索引名](索引字段)
创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段))