20170105数据库表设计知识点

20170105数据库表设计知识点

------指导老师    星哥mysql

1.PHP(MYSQL)擅长单表操做,不要作过多无谓的链接查询程序员

2.表字段名不要使用大驼峰命名方式,最好采用下划线,命名要和团队习惯一致,通俗易懂。外键为全表名+IDsql

3.表级、字段都要有注释数据库

4.MyISAM 适合于一些须要大量查询的应用,但其对于有大量写操做并非很好。甚至你只是须要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都没法操做直到读操做完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。 

InnoDB 的趋势会是一个很是复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,因而在写操做比较多的时候,会更优秀。而且,他还支持更多的高级应用,好比:事务。服务器

5.字符串长度要根据具体的业务场景进行合适的设置,若是不明白,多去参考大公司的规则。网络

6.枚举型字段,最好设置成tintint,便于之后业务变动和拓展 数据结构

7.对于用户名和昵称,不要混淆,一个是登录帐户名,一个是显示昵称,必要的时候能够设置成两个字段。函数

8.int默认是11位,不要私自设置成其余的长度。性能

9.关于价格,最好以int型,展现和进行业务处理是两回事,不要混淆。优化

10.关于图片地址,大小要合适,不要凭想象设置,好比京东是102位,淘宝是80位,必定要合适,之前图片存不进去。

11.若是含有is_del,通常会有删除时间,和谁删除的,尽可能是逻辑删除。避免物理删除。

12.若是含有验证,好比邮箱,手机,最好要多一个字段来代表验证 是否成功。

13.banner图及相似的东西,要给一个排序的字段,这样在从新排序的时候,就不用删除全部记录,从新上传了。

14.避免数据冗余,好比评论昵称,若是昵称更改了,之前的昵称如何显示?

15.通常来讲,订单数据是不容许轻易改变的,以避免用户数据更改了之后,订单状态随之改变

16.支付和订单状态不必定要放在一块儿的,好比货到付款,那么写死的状态就不对了。

17.设置tingint表示的值的时候,要参考具体的业务逻辑和其余接口的设计,不要私自设置。

18.属性能够写活,可是不要出现不可控的现象,更麻烦

19.对于数据,要习惯给予一个默认数据,这样在没有数据的时候读取默认值。

20.挑一个你的SELECT语句(推荐挑选那个最复杂的,有多表联接的),把关键字EXPLAIN加到前面。能够进行表分析,根据分析来优化表

21.当只有一行数据的时候,给予limit 1,MySQL数据库引擎会在找到一条数据后中止搜索,而不是继续日后查少下一条符合记录的数据。 避免多余搜索

22.要习惯为条件字段加上索引。

23.在Join表的时候使用至关类型的例,并将其索引 

若是你的应用程序有不少 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。 

并且,这些被用来Join的字段,应该是相同的类型的。例如:若是你要把 DECIMAL 字段和一个 INT 字段Join在一块儿,MySQL就没法使用它们的索引。对于那些STRING类型,还须要有相同的字符集才行。(两个表的字符集有可能不同)


state中查找company 
$r = mysql_query("SELECT company_name FROM users 
LEFT JOIN companies ON (users.state = companies.state) 
WHERE users.id = $user_id"); 

// 两个 state 字段应该是被建过索引的,并且应该是至关的类型,相同的字符集。

24.避免 SELECT * 从数据库里读出越多的数据,那么查询就会变得越慢。而且,若是你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增长网络传输的负载

25.. 永远为每张表设置一个ID 

咱们应该为数据库里的每张表都设置一个ID作为其主键,并且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增长的 AUTO_INCREMENT标志。 

就算是你 users 表有一个主键叫 “email”的字段,你也别让它成为主键。使用 VARCHAR 类型来当主键会使用得性能降低。另外,在你的程序中,你应该使用表的ID来构造你的数据结构。 

并且,在MySQL数据引擎下,还有一些操做须要使用主键,在这些状况下,主键的性能和设置变得很是重要,好比,集群,分区……

26.尽量使用Not Null

27.IP地址存成 UNSIGNED INT

 

不少程序员都会建立一个 VARCHAR(15) 字段来存放字符串形式的IP而不是整形的IP。若是你用整形来存放,只须要4个字节,而且你能够有定长的字段。并且,这会为你带来查询上的优点,尤为是当你须要使用这样的WHERE条件:IP between ip1 and ip2。

 

咱们必须要使用UNSIGNED INT,由于 IP地址会使用整个32位的无符号整形。

 

而你的查询,你可使用 INET_ATON() 来把一个字符串IP转成一个整形,并使用 INET_NTOA() 把一个整形转成一个字符串IP。在PHP中,也有这样的函数 ip2long() 和 long2ip()。

1 $r = "UPDATE users SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";

28.固定长度的表会更快 

若是表中的全部字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length”。 例如,表中没有以下类型的字段: VARCHAR,TEXT,BLOB。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另外一种方法来处理

29.垂直分割 “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样能够下降表的复杂度和字段的数目,从而达到优化的目的。

相关文章
相关标签/搜索