mysql-fron快速写sql语句_怎样才能写出高质量的SQL语句?

查询语句优化:可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息,会显示索引和查询数据读取数据条数等信息.

例如:where语句优化(在select,delete和update语句里都可用):

1)((a AND b)AND c OR(((a AND b)AND(c AND d))))->(a AND b AND c)OR(a AND b AND c AND d)

2)(a b>5AND b=c AND a=5

3)(b>=5AND b=5)OR(b=6AND5=5)OR(b=7AND5=6)-> b=5 OR b=6

代数等价规则:MySQL应用代数转换来简化和排序表达式。它还可以折叠并减少常量,从而消除了不可能的约束和常量条件。例如,项(5 = 5 AND a> 5)将减少为a> 5。类似地,(a 5 AND b = c AND a = 5。这些规则对于编写条件查询非常有用。

4)# CREATE TABLE t (c TINYINT UNSIGNED NOT NULL);SELECT*FROM t WHERE c ≪ 256;-≫ SELECT*FROM t WHERE1;

5)尽量避免在 where 子句中使用!=或<>操作符,否则将进行全表扫描。

6)对查询进行优化,应避免全表扫描,首先考虑在 where 及 order by 涉及的列上建立索引。

7)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0

8)有很多程序员在多条件查询的时候喜欢用OR,当语句的条件是同一个字段的时候,用IN去代替OR执行的效率会更高。在许多数据库服务器中,IN()只是多个OR子句的同义词,因为两者在逻辑上是等效的。在MySQL中不是这样,MySQL对IN()列表中的值进行排序,并使用快速二进制搜索来查看列表中是否包含值。列表的大小为O(log n),而等效的OR子句系列的列表的大小为O(n)(即大列表的速度慢得多)。

例如:SELECT * FROM record_maintable WHERE ID=131 or ID=139 or ID=140

优化后:SELECT * FROM record_maintable WHERE ID IN (131,139,140)

优化子查询:在MySQL中,尽量使用JOIN来代替子查询.因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高.

在编写sql的时候忽略了join。子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。

例如:SELECT * FROM record_maintable WHERE mainID IN (SELECT id FROM record_maininformation);

优化后:SELECT * FROM record_maintable A Left JOIN record_maininformation B ON B.id=A.mainID

子查询语句执行时间0.022s,优化后的语句执行时间0.003s,优化后的效率明显比优化前高了好几倍。当数据量越大的时候这种优化会更明显。

使用limit:很多时候写语句的程序员知道某一个条件的搜索只有一条数据,但是他们并没有加上limit1所以从效率上来说不如加了limit1的语句高效。因为即使某个搜索条件搜索出来的结果只有1条数据,但是如果你不加上limit1的话,sql还是会帮你全文搜索的。因此加上了limit的语句只要找到数量相同的数据时就会马上停止,而不会继续进行全文搜索

使用索引:索引是提高数据库查询速度最重要的方法之一,使用索引的注意事项:LIKE关键字匹配'%'开头的字符串,不会使用索引。数据库一般都是前缀索引,所以支持模糊匹配在后面。因此如果模糊搜索用了双百分号,索引就起不到作用,也就不能提高执行效率了。当数据表里面已经有了索引的时候,而且数据表中的数据比较多的时候,尽可能使用右侧百分号:语句1:SELECT * FROM record_maintable WHERE ID LIKE ‘%1%’;语句2:SELECT * FROM record_maintable WHERE ID LIKE ‘1%’;

OR关键字的两个字段必须都是用了索引,该查询才会使用索引;用or分割开的条件,如果 or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到

使用多列索引必须满足最左匹配

字段使用函数,将无法使用索引

Join 语句中 Join 条件字段类型不一致的时候 MySQL 无法使用索引

如果mysql估计使用索引扫描比全表扫描更慢,则不使用索引。(扫描数据超过30%,都会走全表)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值