一、表:
单个表的字段数控制在 20个以下,最好不超过50个
单个表不超过20个char 或varchar 字段
单表不超过50个纯int字段
拒绝大SQL,大事务,批量操作
二、字段类型定义:
字段类型选取原则:
1、选取合适范围的数据类型
2、只取正值的数值类型,添加 unsigned属性
3、 固定长度的字符串采用char()类型
4、 在符合数据使用前提下,尽量使用 not null
5 、不用书写数值类型存储的字符个数,比如只使用 Int(只针对数值类型)
6、TEXT类型强制生成磁盘临时表,存储上浪费空间,必须使用的话,需考虑拆分到单独的表中。
7、不在数据库中存储图片
8、避免使用保留字命名
使用案例:
字段 属性
`id` unsigned NOT NULL (仅当数值超过42亿时才使用bigint型)
`color_id` int unsigned
`user_id` int unsigned NOT NULL
`monster_id` int unsigned not null
`monster_family_id` tinyint unsigned not null
`monster_pattern_id` mediumint unsigned not null
`is_lighted` tinyint
相关数据类型存储需求:
类型定义 | 取值范围 | 存储需求 |
TINYINT [UNSIGNED][ZEROFILL] | 带符号: 无符号:0---128 |
1个字节 |
Smalint [unsigned] [zerofill] | 带符号:-32768-32767 无符号:0--65535 |
2个字节 |
Mediumint[unsigned] [zerofill] | 带符号: 无符号:0--16777215 |
3个字节 |
Int [unsigned] [zerofill] | 带符号: 无符号:0-4294967295 |
4个字节 |
Bigint [unsigned] [zerofill] | 带符号: 无符号:0--18446744073709551615 |
8个字节 |
CHAR(M)(M是字符长度) | M个字符长度(0<M255)(不是字节数) | 与字符集有关 |
VARCHAR(M)(M字符长度) |
|
三、键和索引的设计:
1、 命名规范:index_字段名1[_字段名2]
2、 避免对字符串类型添加索引,否则的话 采用enum 或SET类型
3、 只给最常用的查询添加索引
4、 避免使用重复或者多余索引
5、 对于字符索引,可以以前N个字段作为索引 (防止innodb聚集索引带来的 负面)
6、不索引大型字段(有很多字符)
7、不索引常用的小型表
8、不在索引列进行数据运算或函数运算(会导致无法使用索引,或者全表扫描)
9、对于自增列或全局ID做主键,按自增顺序插入值
四、索引使用原则:
1、匹配全部字段
2、匹配索引左边前缀
3、匹配索引列范围值
4、精确一部分索引,并且匹配另一个字段的某个范围
5、对索引字段插入数据时,按照顺序插入
6、尽量不使用外键,产生额外开销,并且使逐行操作,易出现死锁现象
五:dml语句
1、尽量避免使用子查询(使用的话需要确认)
2、Where条件中必须使用和过滤字段完全一致的数据类型,避免使用函数转换字段的格式
3、 对于复合索引,语句必须遵循‘最左前缀’,禁止直接跳过前缀最左边字段。
4、对于order by group by 子句时 尽量引用索引字段。(如能达到mysql为排序和查找行使用同样的索引,引用where中的索引字段
5、select * from 表 避免使用。
6、显示的 使用索引 使用 USE INDEX()关键字
7、SQL语句应尽量简单(一个sql只能在一个CPU运算,命中率高,减少锁定时间,可以用上多个CPU)
8、利用count(*) 进行汇总时,把NULL排除在外,资源开销大,尽量不用。
9、对于非实时统计数据,尽量使用单独统计的表,定期重算
10、不要再程序端显示加锁。
11、insert 语句书写必须加 字段名称
本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/933325,如需转载请自行联系原作者