一、表:

     单个表的字段数控制在 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]带符号:128--127 
无符号:0---128
1个字节
Smalint [unsigned] [zerofill]带符号:-32768-32767 
无符号:0--65535
2个字节
Mediumint[unsigned] [zerofill]带符号:88388608--8388607 
无符号:0--16777215
3个字节
Int [unsigned] [zerofill]带符号:2147683648--2147683647 
无符号:0-4294967295
4个字节
Bigint [unsigned] [zerofill]带符号:9223372036854775808--9223372036854775807 
无符号: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 语句书写必须加 字段名称