(1)mysql避免全表扫描

1、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null,不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。 2、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。  MySQL只有对以下操作符才使用索引:,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。  例如,“SELECT id FROM t WHERE col LIKE 'Mich%';”这个查询将使用索引,但“SELECT id FROM t WHERE col  LIKE '%ike';”这个查询不会使用索引。  3、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。  MySQL只有对以下操作符才使用索引:,>=,BETWEEN,IN,以及某些时候的LIKE。可以在LIKE操作中使用索引的情形是指另一个操作数不是以通配符(%或者_)开头的情形。例如,“SELECT id FROM t WHERE col LIKE 'Mich%';”这个查询将使用索引,但“SELECT id FROM t WHERE col  LIKE '%ike';”这个查询不会使用索引。  4、 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20 可以这样查询:select id from t where num=10 union all select id from t where num=20 5、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。错误:select id from t where substring(name,1,3)='abc'--name正确:select id from t where name like 'abc%' 错误:select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id 正确:select id from t where createdate>='2005-11-30' and createdate错误:select id from t where num/2=100 正确:select id from t where num=100*2 6、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。复合索引的最左优化原则。

(2)mysql联合索引的使用

索引的最左原则(左前缀原则),如(c1,c2,c3,c4....cN)的联合索引,where 条件按照索引建立的字段顺序来使用(不代表and条件必须按照顺序来写),如果中间某列没有条件,或使用like会导致后面的列不能使用索引。索引也能用于分组和排序,分组要先排序,在计算平均值等等。所以在分组和排序中,如果字段顺序可以按照索引的字段顺序,即可利用索引的有序特性

(3)mysql索引失效

1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效3、组合索引,不是使用第一列索引,索引失效。(最左原则)4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。5、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。优化方法:key<>0 改为 key>0 or key<0。6、对索引字段进行计算操作、字段上使用函数,会失效。

(4)mysql执行计划的解读

执行计划各字段含义1、idselect查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。2、select_type分别用来表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。SIMPLE 简单的select查询,查询中不包含子查询或者UNIONPRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARYSUBQUERY 在SELECT或WHERE列表中包含了子查询DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVEDUNION RESULT 从UNION表获取结果的SELECT3、table当前执行的表4、type最好到最差的排序:( 在项目使用中 至少type优化到range和ref )system > const > eq_ref > ref > range > index > alltype所显示的是查询使用了哪种类型,type包含的类型包括如下图所示的几种:system 表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计。const 表示通过索引一次就找到了,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。range 只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、< 、>、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。index Full Index Scan,Index与All区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘读取的)5、possible_keys 显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。key实际使用的索引,如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)6、ref:它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。7、rows:MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。8、包含不适合在其他列中显式但十分重要的额外信息

(5)mysql的exist和in

exists和in的使用方式:

#对B查询涉及id,使用索引,故B表效率高,可用大表 -->外小内大select * from A where exists (select * from B where A.id=B.id);#对A查询涉及id,使用索引,故A表效率高,可用大表 -->外大内小select * from A where A.id in (select id from B);  1、exists是对外表做loop循环,每次loop循环再对内表(子查询)进行查询,那么因为对内表的查询使用的索引(内表效率高,故可用大表),而外表有多大都需要遍历,不可避免(尽量用小表),故内表大的使用exists,可加快效率;  2、in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,对外表使用索引(外表效率高,可用大表),而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。  3、如果用not in ,则是内外表都全表扫描,无索引,效率低,可考虑使用not exists,也可使用A left join B on A.id=B.id where B.id is null 进行优化。  

mysql between 查询不出来_mysql的语句优化相关推荐

  1. mysql 美化sql 很丑_MYSQL SQL语句优化

    1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...

  2. mysql慢查询日志轮转_MySQL slow log相关参数解释

    slow_query_log=1       #是否启用慢查询日志,1为启用,0为禁用 slow_query_log_file=slow.log       #指定慢查询日志文件的路径和名字,可使用绝 ...

  3. mysql慢查询的使用_mysql慢查询使用详解

    1 慢查询定义指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句.慢查询日志就是记录这些sql的日志. 2 开启慢查询日志 找到mysql配置文件my.cnf.在 ...

  4. mysql sql查询昨天的数据_sql语句,查询昨天的数据

    如果在程序中,有前台传来两个时间点:beginTime和endTime,在sql查询中的限制条件就是查询昨天的数据,那么可以这样写: 但是如果在这里要查询昨天的数据的话, 则不能简单地在开始时间的那里 ...

  5. mysql嵌套查询详解_MySQL嵌套查询实例详解

    本文实例分析了MySQL嵌套查询.分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): ...

  6. mysql嵌套查询详解_MySQL嵌套查询实例详解_MySQL

    本文实例分析了MySQL嵌套查询.分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): ...

  7. mysql 联合查询后排序_MySQL的查询(联合查询,查询排序,正则表达式)

    MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询 联合查询实例 -- 联合查询 SELECT * FROM user union ...

  8. [技术]mysql 慢查询时间设置_Mysql 慢查询设置

    -- 查询是否设置慢查询 show variables like 'slow_query%'; -- 慢查询时间  -- show variables like 'long_query_time'; ...

  9. mysql通配符查询字段名_mysql通配符如何查询字段

    mysql通配符查询字段的方法:1.使用[%]表示任何字符出现任意次数,代码为[WHERE title like '%张三']:2.使用[_]表示单个字符,代码为[WHERE title like ' ...

最新文章

  1. redmine 2.2.x 修改文档附件的存放目录
  2. Hibernate的配置文件 Hibernate.cfg.xml与xxx.hbm.xml
  3. ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator
  4. python 将dataframe中的str都转化成float_【Python自学笔记】一次不太成功的利用Python整理的利润表实践...
  5. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信
  6. 网络流之最大流算法(EdmondsKarp)
  7. linux 重启oracle实例_Oracle实战(二)-Oracle概述
  8. 写给数据小白:怎么让你的分析结论超出预期,不再是废纸一堆
  9. 如何学习一个新的系统
  10. AIDL 发生异常的原因 Android java.lang.SecurityException: Binder invocation to an incorrect interface...
  11. 如何快速搭建自己的阿里云服务器(宝塔、Xshell、Xftp配置)
  12. 机器学习-马尔可夫随机场(MRF)
  13. 软件显示服务器端没有启动,打开软件显示无连接服务器,双击服务器显示如图...
  14. crmeb多商户1.7.3
  15. U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法
  16. HTML:设置背景颜色和图片
  17. 第五卷《鏖战雁门(下)》第47章《抉择》
  18. Airtest 在设备安装app
  19. CANopen从站伺服配置报文及使用
  20. 智能公交系统出行越来越便捷

热门文章

  1. 那位标榜技术驱动的开发者去哪了?
  2. 关于 .Net Core runtimeconfig 文件说明
  3. Identity和IdentityServer的区别及联系
  4. 编程语言之父谈语言设计,龟叔大赞TypeScript
  5. ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1
  6. 协作更进一步:微软隆重介绍Visual Studio动态分享功能
  7. 开源OSS.Social微信项目解析
  8. WebAPi的可视化输出模式(RabbitMQ、消息补偿相关)——所有webapi似乎都缺失的一个功能
  9. 理想的互联网服务后台框架的九个要点
  10. 从Unity3D编译器升级聊起Mono