注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

php 王建

php之路

 
 
 

日志

 
 

优化mysql数据库的方法  

2011-08-01 16:33:56|  分类: mysql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM 04f6T  
2、使用连接(JOIN)来代替子查询: BN^$m:mB  
   a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo) .qq>Wn+  
   b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo) u?A*  
   c.提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid F8L)J n  
   WHERE orderinfo.customerid IS NULL 0>(c:}  
3、使用联合(UNION)来代替手动创建的临时表 L#j6*   
   a.创建临时表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2` g*x7 4d  
4、事务处理: Gk_`V>Y  
   a.保证数据完整性,例如添加和修改同时,两者成立则都执行,一者失败都失败 @_jo5I*Tv  
   mysql_query("BEGIN"); a >@mrvQ0  
   mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')"; ; Eq|\   
   mysql_query("SELECT * FROM `orderinfo` where customerid=".$id"); ie}6{l Z  
   mysql_query("COMMIT"); $*%z+  
5、锁定表,优化事务处理: MSY<I]  
   a.我们用一个 SELECT 语句取出初始数据,通过一些计算,用 UPDATE 语句将新值更新到表中。 sF9P=s"  
     包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前, DfAM"v  
     不会有其它的访问来对 inventory 进行插入、更新或者删除的操作 Fwnb_/Y\f  
   mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE"); 9Oy!@a1U  
   mysql_query("SELECT customerid FROM `customerinfo` where id=".$id); Hjbc'5Pw  
   mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id); 0_G{tu(VV  
   mysql_query("UNLOCK TABLES"); 4z>5QL]KY&  
6、使用外键,优化锁定表 l V\G= 7J  
   a.customerinfo里的customerid映射到orderinfo里的customerid, [j3u5hJ0  
     任何一条没有合法的customerid的记录不会写到orderinfo Oe7(J _  
   CREATE TABLE customerinfo LGnHw6_  
   ( ES}@ jdoFF  
     customerid INT NOT NULL, #3Ecv70  
     PRIMARY KEY(customerid)  $ 2  
   )TYPE = INNODB; A:H$!La>  
   CREATE TABLE orderinfo g6STeI  
   ( CD3Ufa/m@  
     orderid INT NOT NULL, ?}b8o  
     customerid INT NOT NULL, wt2O3<kG  
     PRIMARY KEY(customerid,orderid), ZU "d*WE  
     FOREIGN KEY (customerid) REFERENCES customerinfo x(\(F <*  
     (customerid) ON DELETE CASCADE   w$]eW8/1q  
   )TYPE = INNODB; +v'7DP  
   注意:'ON DELETE CASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order n$^TG 2  
         表中的该用户的所有记录,注意使用外键要定义事务安全类型为INNODB; @XN|^&j  
7、建立索引: yi C" [&CU  
   a.格式: 83pK)luo  
   (普通索引)-> [| =F&;Y+  
   创建:CREATE INDEX <索引名> ON tablename (索引字段) .[gn"SP 
   修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段) O"b+8i(gU~  
   创表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段)) j"|iZh5=8  
   (唯一索引)-> 0) #sL`^v  
   创建:CREATE UNIQUE <索引名> ON tablename (索引字段) !d5p]:a{I  
   修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段) f1Er6\?&^X  
   创表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段)) @u{ )<[,  
   (主键)-> bzMt&X:w  
   它是唯一索引,一般在创建表是建立,格式为: 1L}bzr L_  
   CREATA TABLE tablename ([...],PRIMARY KEY[索引字段]) ] Lm  
8、优化查询语句 k246ua,Ew  
   a.最好在相同字段进行比较操作,在建立好的索引字段上尽量减少函数操作 BZI1c,  
   例子1: Yt4~_PW  
   SELECT * FROM order WHERE YEAR(orderDate)<2008;() N+U#e!'ND5  
   SELECT * FROM order WHERE orderDate<"2008-01-01";() bv6Knvr  
   例子2: @\"E@,  
   SELECT * FROM order WHERE addtime/7<24;() px oxnI+  
   SELECT * FROM order WHERE addtime<24*7;() cR~#UL(  
   例子3: OTX\Q=O  
   SELECT * FROM order WHERE title like "%good%"; ,'o~e kqbl  
   SELECT * FROM order WHERE title>="good" and name<"good"; 2<ip P@z  

  评论这张
 
阅读(60)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018