数据库SQL查询语句中的where1=1详细分析
笔者在使⽤数据库查询时,需要设定条件查询,在sql语句后⾯可以设置⼏个条件。但是可以选择条件为空,于是乎两个条件间相接间,第⼀个条件为空,那么第⼆个条件开头就会是 “and”,这样sql语句就会发⽣错误。笔者当时处理时是在sql语句中添加where 1=1来解决。
where 1=1 是为了避免where 关键字后⾯的第⼀个词直接就是 “and”⽽导致语法错误。但是,where 1=1会全表扫描,需要⼤量的IO操作,数据量越⼤越慢。
我们来看⼀下下⾯的查询命令。数据表中⼜三条数据,使⽤explain(执⾏计划),使⽤explain关键字可以模拟优化器执⾏sql查询语句,从⽽知道数据库是如何处理sql语句。explain主要⽤于分析查询语句或表结构的性能瓶颈。
type的值主要有⼋种,该值表⽰查询的sql语句好坏,从最好到最差依次为:
explain查询所使⽤的访问类型,type
system>const>eq_ref>ref>range>index>ALL。
1、system,表只有⼀⾏记录(等于系统表),是const的特例类型,平时不会出现;;
2、const,通过⼀次索引就到了结果,常出现于primary key或unique索引,只匹配⼀⾏数据,所以查询⾮常快;
3、eq_ref,唯⼀索引扫描,对于每个索引键,表中只有⼀条记录与之匹配。常见主键或唯⼀索引扫描。
4、ref,⾮唯⼀性索引扫描,返回匹配某个单独值的所有⾏。本质上也是⼀种索引访问,返回匹配某值(某条件)的多⾏值。
5、range,只检索给定范围的⾏,使⽤⼀个索引来检索⾏,可以在key列中查看使⽤的索引,⼀般出现在where语句的条件中,如使⽤between、>、<、in等查询。
6、index,全索引扫描,index和ALL的区别是index只遍历索引树,通常⽐ALL快,因为索引⽂件通常⽐数据⽂件⼩。虽说index和ALL都是全表扫描,但是index是从索引中读取,ALL是从磁盘中读取。
7、all,全表扫描,⼀般来说,需保证查询⾄少达到range级别,最好能达到ref。
explain查询中还有其他参数。
1、key值:实际中使⽤的索引。 下⾯的possible_keys表⽰理论上可能⽤到的索引,key表⽰实际中使⽤的索引。
2、key_len:表⽰索引中所使⽤的字节数,可通过该列计算查询中使⽤的索引长度。
sql语句查询不包含3、possible_keys:显⽰可能应⽤在表中的索引,可能⼀个或多个。查询涉及到的字段若存在索引,则该索引将被列出,但不⼀定被查询实际使⽤。
4、ref,显⽰关联的字段。如果使⽤常数等值查询,则显⽰const,如果是连接查询,则会显⽰关联的字段。
5、rows,根据表统计信息及索引选⽤情况⼤致估算出到所需记录所要读取的⾏数。
6、filtered,百分⽐值,表⽰存储引擎返回的数据经过滤后,剩下多少满⾜查询条件记录数量的⽐例。
7、Extra,显⽰⼗分重要的额外信息。Using filesort表明mysql会对数据使⽤⼀个外部的索引排序;使⽤了临时表保存中间结果,常见于排序order by和分组查询group by;Using index,select操作中使⽤了覆盖索引,避免访问表的额外数据⾏,效率不错,同时出现了Using where,表明索引被⽤来执⾏索引键值的查。使⽤优先级Using index>Using filesort(九死⼀⽣)>Using temporary(⼗死⽆⽣)。
条件只是where 1=1的话是all,全表扫描,性能低。特别是数据表较⼤时,那么查询的效率就很慢。
那需要怎么优化呢?即查询条件添加索引。在查询时增加必输项,即where 1=1后⾯追加⼀些常⽤的必选条件,并且将这些必选条件建⽴适当的索引,效率会⼤⼤提⾼。
查看下图,如果在where 1=1跟踪主键card_old选项,那么type值就会变成const或者range。,避免全表扫描。
如果后⾯跟踪的不是主键索引或者唯⼀索引呢?查看下图的查询条件选项为为card_number时,还是全表扫描。
加上主键索引,也即是⼜两个条件,⼀个⼜索引,⼀个没有索引,那么查询type是const。
使⽤索引后,也需要保证索引不失效。这个可以参考博客园的⽂章-MySQL⾼级知识(六)——索引优化,总结起来⼜如下⼏点:
1、创建了多列索引的情况下,查询从索引的最左前列开始;
2、在索引列上做任何操作(计算、函数、(⾃动or⼿动)类型转换),会导致索引失效从⽽转向全表扫描。
3、条件范围右边的索引列失效。
4、尽量使⽤覆盖索引,即查询列和索引列尽量⼀致。
5、使⽤不等于(!=或<>)、is null 或 is not null、like通配符以%开头、字符串不加单引号、⽤or连接会使索引失效。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。