关于Mysql的一些优化方法整理

1. 选取合适的字段属性
例:

  • 数据库中,表越小执行查询越快,故在条件允许的情况下字段宽度越小越好。
  • 字段设置为NOT NULL,执行查询的时候,数据库不用去比较NULL值。
  • 将某些文本字段定义为EMUM(枚举类型),枚举类型被当做数值型数据来处理,处理速度比文本类型快。
  • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

2. 使用连接(JOIN)来代替子查询(Sub-Queries)

  • 子查询中使用select语句来创建一个单例的查询结果,然后把这个结果作为过滤条件用在另一个查询中。
  • 连接(JOIN)不需要在内存中创建临时表来完成查询这个逻辑上 需要两个步骤的工作,故其效率更高,尤其是两表之间建立有索引的情况下,性能也会有提升。

3. 使用联合(UNION)来代替手动创建的临时表

  • union查询可以把需要使用临时表的两条或更多的select查询合在一个查询中。在客户端查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。
  • 注意:所有select语句中的字段数目要相同;union需要将两个或者多个结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,增大资源消耗及延迟。故在结果集不需过滤重复值的情况下可使用union all

4. 使用事务

  • 使用事务可保持数据库中的数据的一致性和完整性,能够避免执行语句块时由于某一条语句出错导致的整个语句块操作错误的情况。
  • 在并发操作同一个数据源时,事务可使用锁定数据库的方式来为用户提供一种安全的访问机制,这样可以保证用户的操作不被其它的用户所干扰

5. 锁定表

  • 在事务执行的过程中,数据库将会被锁定,易产生响应延迟。
  • 条件允许情况下,可使用锁表操作。使用LOCKTABLES可锁定表,保证在UNLOCKTABLES命令被执行之前,不会有其它的访问来对表进行插入、更新或者删除的操作。

6. 使用外键

  • 使用锁定表的方法可以维护数据的完整性,却不能保证数据的关联性,此时可使用外键解决。
  • 注意:MySQL中使用外键,需要创建表的时候将表的类型定义为事务安全表InnoDB类型。定义的方法是在CREATE TABLE语句中加上engine=INNODB。

7. 使用索引

  • 使用索引可令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY等命令的时候,性能提高更为明显。
  • 索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。
  • 尽量不要对数据库中某个含有大量重复的值的字段建立索引。例如ENUM类型的字段
  • 一个表的索引数最好不要超过6个,虽然索引可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
  • 应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

8. 优化查询语句

  • 例如:
    • 在相同类型的字段间进行比较操作
    • 在搜索字符型字段时,尽量少使用LIKE关键字和通配符,因为会占用一部分系统性能。
    • 避免在查询中让MySQL进行自动类型转换,因为会导致索引失效。
    • 尽量避免全表扫描,在 where 子句中对字段进行 null 值判断、使用!=或<>操作符、使用 or 来连接条件、使用in 和 not in 、使用参数、对字段进行表达式操作和函数操作,这些都会导致引擎放弃使用索引而进行全表扫描。
    • 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
    • where子句中用 exists 代替 in
    • 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

9 . 临时表的使用

  • 避免频繁创建和删除临时表,以减少系统表资源的消耗。
  • 当需要重复引用大型表或常用表中的某个数据集时,使用临时表可以使某些例程更有效
  • 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
  • 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值