PHP开发者常犯的10个MySQL错误更正剖析


Posted in PHP onJanuary 30, 2012

1.使用MyISAM而不是InnoDB

完全错误,反驳理由:

首先原文说MyISAM是默认使用的,而实际上到了MySQL 5.5.x,InnoDB已经成为了默认的表引擎。

另外,简单的使用InnoDB不是解决所有问题的方法,盲目的使用甚至会使应用性能下降10%乃至40%。

最佳方法还是针对具体业务具体处理,例如论坛中版块表,新闻分类表,各种码表等长时间不操作的表,还是要用性能优异的MyISAM引擎。

而需要用到事务处理的例如用户、账目、流水等严格要求数据完整性和时序性的,则需要用InnoDB引擎,并且应用也要用好事务处理机制。当然,事务处理必然要带来大量的性能损耗,但是这在简单高并发应用上是必须的。

最后,外键约束在公共web互联网应用上一般是不用的,因为他会严重影响性能。数据完整性还是靠程序员或者应用架构本身的健壮来维护。而正规的第三范式只是在企业内部MIS系统和12306这种网站上使用。

2.使用PHP的mysql方法

不完全错,但要酌情选用:

mysqli固然好,但是不是所有的服务器都为PHP编译了mysqli的支持。

当你的应用如果是能确定只用自己部署的服务器,而应用也是完全自己开发,则mysqli是最好的选择。

但是一旦你的应用有可能部署在虚拟主机或者由其他人部署(例如分布式项目),还是老老实实使用mysql函数集吧,好好封装一下或者使用成熟框架杜绝sql注入。

3.不过滤用户输入

这一点不用说了,要么MagicQuote,要么选用成熟框架。sql注入老话题了。

4.不使用UTF-8

大部分情况下对,但也要认真考虑:

要知道,一个UTF-8字符占3个字节,所以比GBK等其他编码的文件大33%。换句话说,相同的网页用UTF-8编码如果是100KB,那么换成GBK编码则只有66KB。所以即便你的PHP确定要用UTF-8,那么前端页面也要根据情况选择需要的编码。但是,如果PHP用UTF-8,前端模版是GBK,再加上模版引擎不强大,那么转码工作够你受的。所以尽可能的选用自己需要的编码,而不是简单的选择UTF-8了事。

最后??乱痪洌?TF-8下:strlen("我")=3,而GBK下:strlen("我")=2

5.该用SQL的地方使用PHP

同样酌情考虑:

例如,有些人习惯在建表时,默认值填写CURRENT_TIMESTAMP,用来达到注册时间、发帖时间的效果。 或者在时间判断的SQL语句中,写类似SELECT x FROM tab1 WHERE regdate 正确做法是:不要使用MySQL的任何时间函数,而是在应用里计算时间。如果是分布式应用,一定要有时间服务器来统一管理时间。

而文中说的一些MySQL数学函数 ,也是要慎用。因为在大型应用中,数据库的负担往往是最大的,而复杂的WHERE语句又是造成慢查询的元凶。所以,要把计算尽可能的放在廉价的、不影响全局稳定的应用服务器上,而不是核心数据库上。

6.不优化查询

这点也不用说了,大型应用上甚至不允许使用各种JOIN,哪怕生写两条查询,查回来在用PHP合并数据。

7.使用错误的数据类型

INT,TinyINT,VARCHAR,CHAR,TEXT这些字段类型的合理选用无可厚非。

而Date、DateTime、TIMESTAMP这三种类型,在大型应用中是绝对不可以使用的,而是要用INT(10) UNSIGNED代替。

一个是性能,另外就是应用中尤其是PHP对UNIX_TIMESTAMP时间戳的转化实在太方便了。用Date要输出各种时间格式反而麻烦。

8.在SELECT查询中使用*

共勉

9.索引不足或者过度索引

索引是必须的,但是如果索引都解决不了的查询,考虑memcache或者nosql解决方案吧。

10.不备份

这条是作者凑数么?

11.另外:不考虑其他数据库

这条相当正确。应用中不仅要针对应用选择其他数据库,甚至还要针对具体的业务类型,在同一套应用中并行使用多种数据库。哪怕不是数据库,而是其他各种缓存、内存存储等解决方案。

PHP 相关文章推荐
关于PHP中的Class的几点个人看法
Oct 09 PHP
php的控制语句
Oct 09 PHP
简单的PHP多图上传小程序代码
Jul 17 PHP
PHP错误和异长常处理总结
Mar 06 PHP
phpMyAdmin自动登录和取消自动登录的配置方法
May 12 PHP
php中的字符编码转换函数用法示例
Oct 20 PHP
php使用CURL伪造IP和来源实例详解
Jan 15 PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
PHP解决高并发问题
Apr 01 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 #PHP
几种有用的变型 PHP中循环语句的用法介绍
Jan 30 #PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 #PHP
php代码收集表单内容并写入文件的代码
Jan 29 #PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 #PHP
php木马webshell扫描器代码
Jan 25 #PHP
php addslashes及其他清除空格的方法是不安全的
Jan 25 #PHP
You might like
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
JQuery AJAX提交中文乱码的解决方案
2010/07/02 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
[01:21:07]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
总结python爬虫抓站的实用技巧
2016/08/09 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python解决八皇后问题示例
2018/04/22 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
小学敬老月活动方案
2014/02/11 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
优秀班主任申报材料
2014/12/16 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS