------指导老师 星哥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.垂直分割 “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样能够下降表的复杂度和字段的数目,从而达到优化的目的。