数据库|快速提升性能的SQL语句,建议收藏( 五 )


  • 为了更快的进行导入 , 在导入时临时禁用唯一性检测;
  • 在每一次备份后计算数据库 , 表以及索引的尺寸 , 以便更够监控数据尺寸的增长;
  • 通过自动调度脚本监控复制实例的错误和延迟;
  • 定期执行备份 。
  • 42、查询缓冲并不自动处理空格 , 因此 , 在写 SQL 语句时 , 应尽量减少空格的使用 , 尤其是在 SQL 首和尾的空格(因为查询缓冲并不自动截取首尾空格) 。
    43、member 用 mid 做标准进行分表方便查询么?一般的业务需求中基本上都是以 username 为查询依据 , 正常应当是 username 做 hash 取模来分表 。
    而分表的话 MySQL 的 partition 功能就是干这个的 , 对代码是透明的;在代码层面去实现貌似是不合理的 。
    44、我们应该为数据库里的每张表都设置一个 ID 做为其主键 , 而且最好的是一个 INT 型的(推荐使用 UNSIGNED) , 并设置上自动增加的 AUTO_INCREMENT 标志 。
    45、在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON , 在结束时设置 SET NOCOUNT OFF 。 无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息 。
    46、MySQL 查询可以启用高速查询缓存 。 这是提高数据库性能的有效MySQL优化方法之一 。 当同一个查询被执行多次时 , 从缓存中提取数据和直接从数据库中返回数据快很多 。
    47、EXPLAIN SELECT 查询用来跟踪查看效果:
    使用 EXPLAIN 关键字可以让你知道 MySQL 是如何处理你的 SQL 语句的 。 这可以帮你分析你的查询语句或是表结构的性能瓶颈 。 EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的 , 你的数据表是如何被搜索和排序的 。
    48、当只要一行数据时使用 LIMIT 1 :
    当你查询表的有些时候 , 你已经知道结果只会有一条结果 , 但因为你可能需要去fetch游标 , 或是你也许会去检查返回的记录数 。
    在这种情况下 , 加上 LIMIT 1 可以增加性能 。 这样一来 , MySQL 数据库引擎会在找到一条数据后停止搜索 , 而不是继续往后查少下一条符合记录的数据 。
    49、选择表合适存储引擎:
    • myisam:应用时以读和插入操作为主 , 只有少量的更新和删除 , 并且对事务的完整性 , 并发性要求不是很高的 。
    • InnoDB:事务处理 , 以及并发条件下要求数据的一致性 。 除了插入和查询外 , 包括很多的更新和删除 。 (InnoDB 有效地降低删除和更新导致的锁定) 。
    • 对于支持事务的 InnoDB类 型的表来说 , 影响速度的主要原因是 AUTOCOMMIT 默认设置是打开的 , 而且程序没有显式调用 BEGIN 开始事务 , 导致每插入一条都自动提交 , 严重影响了速度 。 可以在执行 SQL 前调用 begin , 多条 SQL 形成一个事物(即使 autocommit 打开也可以) , 将大大提高性能 。
    50、优化表的数据类型 , 选择合适的数据类型:
    原则:更小通常更好 , 简单就好 , 所有字段都得有默认值 , 尽量避免 NULL 。
    例如:数据库表设计时候更小的占磁盘空间尽可能使用更小的整数类型 。 (mediumint 就比 int 更合适)
    比如时间字段:datetime 和 timestamp 。 datetime 占用8个字节 , timestamp 占用4个字节 , 只用了一半 。 而 timestamp 表示的范围是 1970—2037 适合做更新时间 。
    MySQL可以很好的支持大数据量的存取 , 但是一般说来 , 数据库中的表越小 , 在它上面执行的查询也就会越快 。
    因此 , 在创建表的时候 , 为了获得更好的性能 , 我们可以将表中字段的宽度设得尽可能小 。
    例如:在定义邮政编码这个字段时 , 如果将其设置为 CHAR(255) , 显然给数据库增加了不必要的空间 。 甚至使用VARCHAR 这种类型也是多余的 , 因为 CHAR(6) 就可以很好的完成任务了 。