MySQL优化--where条件字段的顺序对效率的影响 (02)

学生表 Student

id(编号) name(名字) age(年龄) height(身高)
1 Tommy 26 170
2 Jerry 23 180
3 Frank 30 160

如表所示,这里只是呈现了3条数据,我们这里假设有1万条数据,

查询年龄25岁以上,身高170以上的全部学生

Select * from Student where age > 25 and height > 170;//正常情况下可以这么写,

假设1:年龄在25岁以上的有8000个学生,而身高170以上的只有10个学生,

上述的SQL的执行顺序和查询的行数应该是:

1.先查询年龄25岁以上的学生,结果有8000条记录,

2.再查询身高170以上的学生,就得在8000条结果里再次判断,最坏的可以遍历8000次左右,这效率较低

假如更改上述SQL语句where条件字段的顺序,如下:

Select * from Student where height > 170 and age > 25;

那么结果将是:

1.首先是查询出身高170以上的学生,结果只有10个;

2.然后再在这10个结果中查询出年龄大于25岁的学生,这样遍历的次数一下子就减少了很多很多

总结:所以,千万不要以为where语句中字段的顺序可以随便乱写,应该结合具体情况来安排好顺序,以使效率更高,

当然,如果想效率进一步提高,应该在这两个字段上建立索引 (题外: 索引的建立以及 什么条件下索引才会被调用)

时间: 2024-08-24 00:44:06

MySQL优化--where条件字段的顺序对效率的影响 (02)的相关文章

MySQL优化:使用慢查询日志定位效率较低的SQL语句

MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL . 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态.是否锁表等,可以实时地查看SQ

Mysql查询按照某字段指定顺序排序

在项目当中用到Sphinx的时候,很多人遇到了这样的问题:使用mysql+Sphinx检索出了相关度的ID后,如何按照指定ID在Mysql中进行排序呢?这里是我在项目中的解决方法: 1 SELECT * FROM documents WHERE id IN (5,3,6,1) ORDER BY FIELD(id,5,3,6,1); 或者: 1 SELECT * FROM documents WHERE id IN (5,3,6,1) ORDER BY substring_index((id,5,

MySQL优化之——查看字段长度

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46559973 CREATE TABLE tmp13(vb VARBINARY(10)) INSERT INTO tmp13 (vb) VALUES(12) SELECT LENGTH(vb) FROM tmp13 INSERT INTO tmp13 (vb) VALUES(1212)

MySQL优化--表之间JOIN的关键字ON和Where (01)

1. Join关键字,就是把多个表连接起来 而on和where都是条件,但是针对的对象不一样 1.1. 关键字 On是指怎样把两个表连接起来,如: on a.name = b.name 是一行一行的比较,然后联合起来,此时并没有判断where子句的内容 1.2. 关键字 Where 是针对所有表联合起来的 最终的数据,所以说它们的作用是不一样的 2. 适当的优化 关键字 Where 是遍历最终联合的数据,逐条遍历与条件匹配,所以最终数据的数据行数越少,效率越高(题外,where条件字段的顺序对效

mysql优化案例

MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, comment:0 mysql5.1开始支持数据表分区了,原来的分表可以不用了,分表的不足在于多表查询不方便.呵呵,下面来简单测试下表分区的查询效率. 1.用来测试的数据为discuz论坛的数据库,表为cdb_posts表,数据量为1500多万条mysql> select count(*) fro

MySql常见数据类型,SQL执行顺序,条件语句,转储,查看表中字段属性

数据类型: 1 数字: Tinyint:小数据 用于保存一些范围的整数数值范围 有符号: -128-127 无符号: 0-255 int 整数 数据类型用于保存一些范围的整数数值范围 有符号: -2147483648--2147483647 无符号: 0-4294967295 Bigint 大整数 数据类型用于保存一些范围的整数数值范围: 有符号: -9223372036854775808--9223372036854775807 无符号: 0-18446744073709551615 floa

mysql组合索引与字段顺序

很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子:假设有一张订单表(orders),包含order_id和product_id二个字段.一共有31条数据.符合下面语句的数据有5条.执行下面的sql语句: 1 2 3 select product_id from orders where order_id in (123, 312, 223, 132, 22

[转]mysql组合索引与字段顺序

下列转自:http://www.tech-q.cn/archiver/tid-11673.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子:假设有一张订单表(orders),包含order_id和product_id二个字段.一共有31条数据.符合下面语句的数据有5条.执行下面的sql语句: select product_id from orde

MySQL索引使用:字段为varchar类型时,条件要使用''包起来

结论: 当MySQL中字段为int类型时,搜索条件where num='111' 与where num=111都可以使用该字段的索引.当MySQL中字段为varchar类型时,搜索条件where num='111' 可以使用索引,where num=111 不可以使用索引 验证过程: 建表语句: CREATE TABLE `gyl` ( `id` int(11) NOT NULL AUTO_INCREMENT, `str` varchar(255) NOT NULL, `num` int(11)