字段设计
- 尽量使用数字型,比字符型快;如果0-200,使用tinyint unsigned更好
- 尽量不要使用NULL,除非必要使用NOT NULL + DEFAULT替代
- 少用text和image,二进制字段的读写比较慢
- 使用int代替varchar(15)来存储IP地址
- 使用MySQL内建的类型(date,time,datetime等)而不是字符串来存储日期和时间
- 建议只分配真正需要的空间
- 考虑使用BIGINT代替DECIMAL,将需要存储的值根据小数的位数乘以相应的倍数即可
sql优化
- explain优化sql
- limit获取唯一行,避免扫描整张表
- 避免使用select*
- 保证连接的索引是相同的类型
- 不要使用by rand()命令
- 采用join来替换子查询
- 小心使用通配符
索引
- 根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、排序的字段作为索引的候选字段。
- 把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前面,把重复率低的字段放在前面。
- 一个表不要加太多索引,因为索引影响插入和更新的速度。
其他:
- MyISAM和InnoDB的选择
- MyISAM不支持事务,InnoDB是事务类型的存储引擎
- MyISAM只支持表级锁,BDB支持页级锁和表级锁默认为页级锁,而InnoDB支持行级锁和表级锁默认为行级锁
- MyISAM引擎不支持外键,InnoDB支持外键
- MyISAM引擎的表在大量高并发的读写下会经常出现表损坏的情况
对于count()查询来说MyISAM更有优势;InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
http://www.cnblogs.com/easypass/archive/2010/12/08/1900127.html