xiyoulaoyuanjia / blog

记录与总结 and else?
5 stars 2 forks source link

数据库优化方面的(for mysql) #11

Closed xiyoulaoyuanjia closed 9 years ago

xiyoulaoyuanjia commented 11 years ago

参考一

xiyoulaoyuanjia commented 11 years ago
  • 选择合适的字段的属性. 例如属性与性别最好设置为ENUM类型. 表的字段尽可能的小(数据库中的表越小在它上面执行的速度也越快)
  • 尽量避免使用 NULL 原因是在某列上面做索引的时候如果这列有NULL,则需要更多的存储空间..mysql内部还需一些特殊的处理
  • 使用join 来代替子查询
 a.删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOTin(SELECT customerid FROM orderinfo)
 b.提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOTin(SELECT customerid FROM orderinfo)

提高b的速度优化注意这里使用了左连接:

SELECT FROM customerinfo LEFT JOIN orderidcustomerinfo.customerid=orderinfo.customerid
WHERE orderinfo.customerid IS NULL
  • mysql 临时表 的含义是指在连接的时候创建一个表.连接断开的时候表就删除了..创建临时表只需要在一般的表 前面加一个TEMPORARY. 使用临时表的原因是 在 连接之后需要经常性的对大集合表的子集操作则可以选择创建一个 临时表...
SELECT name FROM `nametest` 

UNION 

SELECT username FROM `nametest2`
  • 事务处理 多个操作一起执行
 mysql_query("BEGIN");
 mysql_query("INSERT INTOcustomerinfo (name) VALUES ('$name1')";
 mysql_query("SELECT * FROM`orderinfo` where customerid=".$id");
 mysql_query("COMMIT");
  • 锁定表 优化事务处理 (注意这里可以优化到事件操作部分)
 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");
  • 建立索引

创建索引 可以使用 ALTER TABLE 或者 CREATE INDEX

  • ALTER TABLE 可以创建 普通索引,UNIQUE索引,PRIMARY KEY索引
ALTER TABLE table_name ADD INDEX index_name (column_list)

ALTER TABLE table_name ADD UNIQUE (column_list)

ALTER TABLE table_name ADD PRIMARY KEY (column_list)
  • CREATE INDEX 可以增加普通索引 与 UNIQUE索引
CREATE INDEX index_name ON table_name (column_list)

CREATE UNIQUE INDEX index_name ON table_name (column_list)
  • 索引类型

创建索引时可以规定索引包不包含重复值.如果不包含重复值则 为PRIMARY KEY或UNIQUE索引

  • 删除索引

DROP INDEX语句来删除索引

DROP INDEX index_name ON talbe_name

  • 在建立好索引的字段上面尽量少进行函数操作.. 例如以下几个例子
 SELECT * FROM order WHEREYEAR(orderDate)<2008;(慢)
 SELECT * FROM order WHEREorderDate<"2008-01-01";(快)
 SELECT * FROM order WHEREaddtime/7<24;(慢)
 SELECT * FROM order WHEREaddtime<24*7;(快)
 SELECT * FROM order WHERE title like"%good%";
 SELECT * FROM order WHEREtitle>="good" and name<"good";
xiyoulaoyuanjia commented 11 years ago
  • where 执行顺序是从至下往最上面执行 所以一般把能过滤最大数据的信息放到最下面..
xiyoulaoyuanjia commented 11 years ago

数据库1中存放着a类数据,数据库2中存放着以天为单位划分的表30张(比如table_20110909,table_20110910,table_20110911),总共是一个月的数据。表1中的a类数据中有一个字段userid来唯一判别用户身份,表2中的30张表(每张表结构相同)也有一个字段userid来唯一识别用户身份。如何判定a类数据库的多少用户在数据库2中出现过?

可以参考这里