mysql数据库优化
- 利用LIMIT 1取得唯一行,这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引。
- 保证连接的索引是相同的类型
- 不要使用BY RAND()命令,MySQL可能会为表中每一个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),
然后给你仅仅返回一行。 - 尽量避免SELECT *命令:从表中读取越多的数据,查询会变得更慢。
- 准备好的sql语句
- 视情况确定存储类型
- 永远为每张表设置一个ID
- 使用ENUM而不是VARCHAR,ENUM类型是非常快和紧凑的。
- 无缓冲的查询
- 固定长度的表会更快,表中没有如下类型的字段: VARCHAR,TEXT,BLOB,则为固定长度的表
- 垂直分割,垂直分割是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。
MySQL数据引擎
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。
基本差别:
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。 NULL列索引。 对变长行比ISAM表有更少的碎片。 支持大文件。 更好的索引压缩。 更好的键吗统计分布。 更好和更快的auto_increment处理。
SQL注入攻击
程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
例子:
某个网站的登录验证的SQL查询代码为:
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "')
and (pw = '"+ passWord +"');"
恶意填入
userName = "1' OR '1'='1";
或者
passWord = "1' OR '1'='1";
时,将导致原本的SQL字符串被填为
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and
(pw = '1' OR '1'='1');"
也就是实际上运行的SQL命令会变成下面这样的
strSQL = "SELECT * FROM users;"因此达到无账号密码,亦可登录网站。所以SQL注入攻击被俗称为黑客的填空游戏。
应对办法(数据库防火墙,虚拟补丁技术)
从安全技术手段上来说,可以通过数据库防火墙实现对SQL注入攻击的防范,因为SQL注入攻击往往是通过应用程序来进攻,可以使用虚拟补丁技术实现对注入攻击的SQL特征识别,实现实时攻击阻断。