建表时:

1.字段的取值是有限而且固定的,最好使用enum 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

2. 从 PROCEDURE ANALYSE() 取得表的设置建议 
PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议。只有表中有实际的数据,这些建议才会变得有用,因为要做一些大的决定是需要有数据作为基础的。 

点击 “Propose table structure” 来查看这些建议,一定要注意,这些只是建议,只有当你的表里的数据越来越多时,这些建议才会变得准确。一定要记住,你才是最终做决定的人。 

例如:

SELECT
* from worker
PROCEDURE ANALYSE(1)

3.越小的列会越快 

例如bigint>int>mediumint>smallint 65535>tinyint 255

4.建表尽量使用not null 

  null 也占用空间

 

1.使用查询缓存,即写程序时不要使用自带sql函数

  像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存。 

2.当只要一行数时,用limit 1

  MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据

3.存在性验证:select 1

  select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录。

  select 1 from 中的1是一常量,查到的所有行的值都是它,

  但从效率上来说,1>anycol>*,因为不用查字典表。

4. 为搜索字段建索引 

  索引并不一定就是给主键或是唯一的字段。如果在你的表中,有某个字段你总要会经常用来做搜索,那么,请为其建立索引吧。

5.少用SELECT *  

  用什么取什么

6.永远为每张表设置一个ID 
  最好为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的 AUTO_INCREMENT标志。

 7.拆分大的 DELETE 或 INSERT 语句 

如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。 

Apache 会有很多的子进程或线程。所以,其工作起来相当有效率,而我们的服务器也不希望有太多的子进程,线程和数据库链接,这是极大的占服务器资源的事情,尤其是内存。 

如果你把你的表锁上一段时间,比如30秒钟,那么对于一个有很高访问量的站点来说,这30秒所积累的访问进程/线程,数据库链接,打开的文件数,可能不仅仅会让你泊WEB服务Crash,还可能会让你的整台服务器马上掛了。 

所以,如果你有一个大的处理,你定你一定把其拆分,使用 LIMIT 条件是一个好的方法。下面是一个示例:

mysql查询优化 随笔 第1张
while (1) { 
//每次只做1000条 
mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000"); 
if (mysql_affected_rows() == 0) { 
// 没得可删了,退出! 
break; 
} 
// 每次都要休息一会儿 
usleep(50000); 
}
mysql查询优化 随笔 第2张
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄