php+mysql开发中的经验与常识小结

 更新时间£º2019年03月25日 11:51:41   作者£º12345987   我要评论

这篇文章主要介绍了php+mysql开发中的经验与常识,简单总结分析了php+mysql数据库程序设计中的命名规范¡¢数据库表¡¢字段¡¢索引等相关设计与使用规范,需要的朋友可以参考下

本文总结了php+mysql开发中的经验与常识¡£分享给大家供大家参考£¬具体如下£º

一¡¢基础规范

£¨1£©尽量使用 InnoDB 存储引擎

支持事务¡¢行级锁¡¢并发性能更好£¬CPU 及内存缓存页优化得当£¬资源利用率更高

£¨2£©必须使用 UTF8 字符集

无需转码£¬无乱码风险

£¨3£©数据表¡¢数据字段必须加入中文注释

N 年后谁知道这个 r1,r2,r3 字段是干嘛的

£¨4£©尽量不要使用存储过程¡¢视图¡¢触发器¡¢Event

高并发大数据的互联网业务£¬架构设计思路是¡°解放数据库 CPU£¬将计算转移到服务层?#20445;?#24182;发量大的情况下£¬这些功能很可能将数据库拖死£¬业务逻辑放到服务层具备更好的扩展性£¬能够轻易实现¡°增机器就加性能¡±¡£数据库擅长存储与索引£¬CPU 计算尽量挪到上层

£¨5£©禁止存储大文件或者大照片

不要让数据库做它不擅长的事情¡£大文件和照片存储在文件系?#24120;?#20351;用上传服务£©£¬数据库里存 URI

二¡¢命名规范

£¨6£©库名¡¢表名¡¢字段名£º小写£¬下划线风格£¬不超过 32 个字符£¬必须见名知意£¬禁止拼音英文混用

£¨7£©表名简洁清晰£¬非唯一索引名 idx_xxx£¬唯一索引名 uniq_xxx

三¡¢表设计规范

£¨8£©单实例表数目必须小于 500

£¨9£©单表列数目最好小于 30

£¨10£©表必须有主键£¬例如自增主键

a£©主键递增£¬数据行写入可以提高插入性能£¬可以避免 page 分裂£¬减少表碎片£¬提升空间和内存的使用

b£©主键要选择较短的数据类型£¬ Innodb 引擎普通索引都会保存主键的值£¬较短的数据类型可以?#34892;?#30340;减少索引的磁盘空间£¬提高索引的缓存效率c£© 无主键的表删除£¬在 row 模式的主从架构£¬会导致备库卡住

£¨11£©禁止不要使用外键£¬如果有外键完整性约束£¬需要应用程序控制

外键会导致表与表之间耦合£¬update 与 delete 操作都会涉及相关联的表£¬十分影响 sql 的性能£¬甚至会造成死锁¡£高并发情况下容易造成数据库性能£¬大数据高并发业务场景数据库使用以性能优先

四¡¢字段设计规范

£¨12£©必须把字段定义为 NOT NULL 并且提供默?#29616;?/h3>

a£©null 的列使索引/索引统计/?#24403;?#36739;都更加复杂£¬对 MySQL 来说更难优化
b£©null 这种类型 MySQL 内部需要进行特殊处理£¬增加数据库处理记录的复杂性£»同等条件下£¬表中有较多空字段的时候£¬数据库的处理性能会降低很多
c£©null 值需要更多的存储空间£¬无论是表还是索引中每行中的 null 的列都需要额外的空间来标识
d£©对 null 的处理时候£¬只能采用 is null 或 is not null£¬而不能采用=¡¢in¡¢<¡¢<>¡¢!=¡¢ not in 这些操作符号¡£如£ºwhere name!='cuiyang'£¬如果存在 name 为 null 值的记录£¬查询结果就不会包含 name 为 null 值的记录

£¨13£©禁止使用 TEXT¡¢BLOB 类型

会浪费更多的磁盘和内存空间£¬非必要的大量的大字段查询会淘汰掉热数据£¬导致内存命中?#22987;本?#38477;低£¬影响数据库性能

£¨14£©避免使用小数存储货币

使用整数存储£¬小数容易导致钱对不上

£¨15£©必须使用 varchar(20)存储手机号

  • a£©涉及到区号或者国家代号£¬可能出现+-()
  • b£©手机号会去做数学运算么£¿
  • c£©varchar 可以支持模糊查询£¬例如£ºlike¡°138%¡±

£¨16£©禁止使用 ENUM£¬可使用 TINYINT 代替

  • a£©增加新的 ENUM 值要做 DDL 操作
  • b£©ENUM 的内部?#23548;?#23384;储就是整数£¬你以为自己定义的是字符串£¿

五¡¢索引设计规范

£¨17£©单表索引建议控制在 5 个以内

£¨18£©单索引字段数不允许超过 5 个

字段超过 5 个时£¬?#23548;?#24050;经起不到?#34892;?#36807;滤数据的作用了

£¨19£©禁止在更新十分频繁¡¢区分度不高的属性上建立索引

  • a£©更新会变更 B+树£¬更新频繁的字段建立索引会大大降低数据库性能
  • b£©¡°性别¡±这种区分度不大的属性£¬建立索引是没有什么意义的£¬不能?#34892;?#36807;滤数据£¬性能与全表扫描类似

£¨20£©建立组合索引£¬必须把区分度高的字段放在前面

能够更加?#34892;?#30340;过滤数据

六¡¢SQL 使用规范

£¨21£©禁止使用 SELECT *£¬只获取必要的字段£¬需要?#20801;¾Ë得?#21015;属性

  • a£©读取不需要的列会增加 CPU¡¢IO¡¢NET 消耗
  • b£©不能?#34892;?#30340;利用覆盖索引
  • c£©使用 SELECT *容易在增加或者删除字段后出现程序 BUG

£¨22£©禁止使用 INSERT INTO t_xxx VALUES(xxx)£¬必须?#20801;?#25351;定插入的列属性

容易在增加或者删除字段后出现程序 BUG

£¨23£©禁止使用属性隐式转换

SELECT uid FROM t_user WHERE phone=13812345678

 会导致全表扫描£¬而不能命中 phone 索引

£¨24£©避免在 WHERE 条件的属性上使用函数或者表达式

SELECT uid FROM t_user WHERE from_unixtime(day)>='2017-02-15' 

会导致全表扫描正确的写法是£º

SELECT uid FROM t_user WHERE day>= unix_timestamp(¡®2017-02-15 00:00:00')

£¨25£©避免?#21512;?#26597;询£¬禁止%开头的模糊查询

a£©?#21512;?#26597;询条件£ºNOT¡¢!=¡¢<>¡¢!<¡¢!>¡¢NOT IN¡¢NOT LIKE 等£¬会导致全表扫描
b£©%开头的模糊查询£¬会导致全表扫描

£¨26£©避免大表使用 JOIN 查询及子查询

会产生临时表£¬消耗较多内存与 CPU£¬极大影响数据库性能

£¨27£©避免使用 OR 条件£¬尽量改为 IN 查询

旧版本 Mysql 的 OR 查询是不能命中索引的£¬即使能命中索引£¬数据库也需要耗费更多的 CPU 帮助实施查询优化

£¨28£©应用程序必须捕获 SQL 异常£¬并有相应处理

更多关于PHP相关内容?#34892;?#36259;的读者可查看本站专题£º¡¶php+mysql数据库操作入门教程¡·¡¢¡¶php+mysqli数据库程序设计技巧总结¡·¡¢¡¶php面向对象程序设计入门教程¡·¡¢¡¶PHP数组(Array)操作技巧大全¡·¡¢¡¶php字符串(string)用法总结¡·及¡¶php常见数据库操作技巧汇总¡·

希望本文所述?#28304;?#23478;PHP程序设计有所帮助¡£

相关文章

最新评论

ÁÉÄþ35Ñ¡7¿ª½±½á¹û