优化MYSQL数据库的方法

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";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值