mysql数据库优化

  1. 利用LIMIT 1取得唯一行,这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引。
  2. 保证连接的索引是相同的类型
  3. 不要使用BY RAND()命令,MySQL可能会为表中每一个独立的行执行BY RAND()命令(这会消耗处理器的处理能力),
    然后给你仅仅返回一行。
  4. 尽量避免SELECT *命令:从表中读取越多的数据,查询会变得更慢。
  5. 准备好的sql语句
  6. 视情况确定存储类型
  7. 永远为每张表设置一个ID
  8. 使用ENUM而不是VARCHAR,ENUM类型是非常快和紧凑的。
  9. 无缓冲的查询
  10. 固定长度的表会更快,表中没有如下类型的字段: VARCHAR,TEXT,BLOB,则为固定长度的表
  11. 垂直分割,垂直分割是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。

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特征识别,实现实时攻击阻断。