mysql怎么优化sql语句_Mysql中SQL语句优化

查询语句优化:

首先是对索引的应用,如果查询过慢首先去提高对于索引的应用,会有明显的收获

简化或避免排序,对于索引列的排序可以接受,非索引列的排序是很影响效率的

使用连接(join)来代替子查询(Sub-Queries)

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

删除不必要的括号

使用常数,删除常数条件

索引使用的常数表达式仅计算一次

在一个表中,没有一个where的count(*)直接从表中检索信息

所有常数的表在查询中在任何其他表之前读出

对外联结表最好联结组合是尝试了所有可能性找到的

如果有一个order by字句和一个不同的group by子句或者order by或者group by包含不是来自联结的第一个表的列,那么创建一个临时表

如果使用了sql_small_result,那么msyql使用在内存中的一个表

每个表的索引给查询并且使用跨越少于30%的行的索引

每个记录输出前,跳过不匹配having子句的行

优化left join

在mysql中 a left join b按以下方式实现

表b依赖于表a

表a依赖于所有用在left join条件的表(除了b)

所有left join条件被移到where子句中

进行所有的联结优化,除了一个表总是在所有他依赖的表后读取.如果有一个循环依赖,那么将发生错误

进行所有的标准的where优化 f:如果在a中有一行匹配where子句,但是在b中没有任何匹配left join条件,那么,在b中生成的所有设置为NULL的一行

如果使用left join来找出某些表中不存在的行并且在where部分有column_name IS NULL测试(column_name为NOT NULL列).那么,mysql在它已经找到了匹配left join条件的一行后,将停止在更多的行后寻找

优化limit

如果用limit只选择一行,当mysql需要扫描整个表时,它的作用相当于索引

如果使用limit#与order by,mysql如果找到了第#行,将结束排序,而不会排序正个表

当结合limit#和distinct时,mysql如果找到了第#行,将停止

只要mysql已经发送了第一个#行到客户,mysql将放弃查询

limit 0一直会很快的返回一个空集合.

临时表的大小使用limit#计算需要多少空间来解决查询

插入优化:

插入一条记录的是由以下构成:

连接(3)

发送查询给服务器(2)

分析查询(2)

插入记录(1*记录大小)

插入索引(1*索引)

关闭(1)

以上数字可以看成和总时间成比例

改善插入速度的一些方法:

如果同时从一个连接插入许多行,使用多个值的insert,这比用多个语句要快

如果从不同连接插入很多行,使用insert delayed语句速度更快

用myisam,如果在表中没有删除的行,能在select:s正在运行的同时插入行

当从一个文本文件装载一个表时,用load data infile.这个通常比insert快20 倍

可以锁定表然后插入--主要的速度差别是在所有insert语句完成后,索引缓冲区仅被存入到硬盘一次.一般与有不同的insert语句那样多次存入要快.如果能用一个单个语句插入所有的行,锁定就不需要.锁定也降低连接的整体时间.但是对某些线程最大等待时间将上升.

例如:

thread 1 does 1000 inserts

thread 2,3 and 4 does 1 insert

thread 5 does 1000 inserts

如果不使用锁定,2,3,4将在1和5之前完成.如果使用锁定,2,3,4,将可能在1和5之后完成.但是整体时间应该快40%.因为insert,update,delete操作在mysql中是很快的,通过为多于大约5次连续不断的插入或更新一行的东西加锁,将获得更好的整体性能.如果做很多一行的插入,可以做一个lock tables,偶尔随后做一个unlock tables(大约每1000行)以允许另外的线程存取表.这仍然将导致获得好的性能.load data infile对装载数据仍然是很快的.

为了对load data infile和insert得到一些更快的速度,扩大关键字缓冲区.

更新优化:

它的速度依赖于被更新数据的大小和被更新索引的数量

使update更快的另一个方法是推迟修改,然后一行一行的做很多修改.如果锁定表,做一行一行的很多修改比一次做一个快

删除优化:

删除一个记录的时间与索引数量成正比.为了更快的删除记录,可以增加索引缓存的大小 从一个表删除所有行比删除这个表的大部分要快的多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值