mysql between 查询不出来_mysql的语句优化

(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执行计划的解读

f4db9c58b5872589e50686079022c522.png

执行计划各字段含义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 进行优化。  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表之删除链表a/b处的节点

题目: 删除链表a/b处的节点 比如链表1、2、3、4、5 如果a/b=r; 如果0<r<1/5;删除节点1 如果1/5<r<2/5;删除节点2 如果2/5<r<3/5;删除节点3 如果3/5<r<4/5;删除节点4 如果4/5<r<5/5;删除节点5 思路: 得到我们需要删除链表的第几个的值,假设…

大开眼界!终于等到这部每一帧都是壁纸的纪录片!

全世界只有3.14 % 的人关注了爆炸吧知识中国&#xff0c;拥有七大水系&#xff0c;超过2600个自然湖泊&#xff0c;299.7万平方公里海洋面积。生活在陆地&#xff0c;周遭的一切都是被水体所包裹。但还从来没有哪一部纪录片&#xff0c;系统探秘过中国水下。水面之上&#xff0…

C#9.0 每个开发人员都必须知道的4个特性

在 .NET 5.0 的发布中&#xff0c;不仅统一了框架&#xff0c;微软还在C#9.0中推出了一些新特性。本版本中,印象深刻的功能:Init-only setters (初始化设置器)Records (记录)Top-level statements (顶级语句)Pattern matching (模式匹配)Init-only setters (初始化设置器)以前&…

Binary Search二分法搜索C++程序

二分法基本上学计算机的都听过&#xff0c;但是有人不知道的就是其实二分法是减治法的思想。 所谓减治法和分治法有一个主要差别就是减治法是减去一般&#xff0c;就是分治之后只需要解决原问题的一半就可以了得到全局问题的解了。所以速度很快。 下面是二分法的递归程序和非递…

linux 后台一直执行的sh

echo "nohup /home/test/inosync.sh &" >> /etc/rc.local转载于:https://blog.51cto.com/837877/1069581

求两个数的最小公约数和最小公倍数

题目: 求两个数的最小公约数和最小公倍数 思路: 求最大公约数: 欧几里得在其《几何原本》中提出的欧几里得算法,有称辗转相除法, 具体做法是如果q和r分别是m除以n的商及玉树,m=nq+r,那么m和n的最大公约数等于n和 r的最大公约数 求最小公倍数:最小公倍数等于a*b/他…

idea mysql 创建表_idea 根据数据库表自动创建持久化类

TODO&#xff1a;Go语言goroutine和channel使用TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理.使用的时候在函数前面加"go"这个 ...翻译&#xff1a;使用 ASP&period;NET MVC 4&comma; EF&comma;…

.NET 6新特性试用 | Nuget包验证

前言我们常常需要将.NET类库打包成Nuget包&#xff0c;以便多个项目公用。一旦修改类库&#xff0c;尽管代码可以运行&#xff0c;并成功打包成新版本&#xff0c;看起来一切正常&#xff0c;但是你无法保证该更改是安全且兼容的。而在.Net 6中&#xff0c;提供了包验证工具&am…

php基础系列:从用户登录处理程序学习mysql扩展基本操作

用户注册和登录是网站开发最基本的功能模块之一&#xff0c;现在通过登录处理程序代码来学些下php对mysql的基本操作。 本身没有难点&#xff0c;主要是作为开发人员&#xff0c;应该能做到手写这些基本代码&#xff0c;算是自己加强记忆&#xff0c;同时希望能给初学者一些参考…

SSIS package 更新 variable

在Package中声明一个variable&#xff0c;在package运行的过程中&#xff0c;SSIS如何update Variable&#xff1f; 第一种方法&#xff1a;使用 Script Task 来更新Variable的值 1&#xff0c;创建一个variable &#xff0c;VariableName是VarCode&#xff0c;并将变量传递到脚…

socket第三方库 AsyncSocket(GCDAsyncSocket)

为什么80%的码农都做不了架构师&#xff1f;>>> Socket描述了一个IP、端口对。它简化了程序员的操作&#xff0c;知道对方的IP以及PORT就可以给对方发送消息&#xff0c;再由服务器端来处理发送的这些消息。所以&#xff0c;Socket一定包含了通信的双发&#xff0c…

想给男友一个惊喜,没想到是这样的结局......

1 想给男友一个惊喜&#xff08;via.澎湃新闻&#xff09;▼2 花10w买了副画&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 台北温馨一幕▼4 把土豆切成丁&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 你为何如此自信&#xff1f;&#xff08;素材…

NS 802.11函数分析(一)

recv函数有两个作用&#xff0c;不仅是接收其他节点发送的包&#xff0c;而且当节点接收到其他包的时候也会调用recv&#xff08;&#xff09; 首先给出NS2中recv的源码&#xff0c;和一些注释&#xff1a; 1 void2 Mac802_11::recv(Packet *p, Handler *h)3 {4 struct hdr…

Android之怎么隐藏EditText光标和自动显示键盘

不废话,先爆照 让EditText不现实光标 关键代码: android:focusable="true" android:focusableInTouchMode="true" 写这个父视图里面 下面是全部代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"…

0408~送给小伙伴的汉堡包

经过一番的结对编程&#xff0c;同学院们对Ta有什么想法呢&#xff1f; 用汉堡包的方式评价一下自己的合作伙伴。 开始囉~~~~~~~~ 第一片面包&#xff1a;解决问题的能力还是蛮强的&#xff0c;在编程的过程中精力集中&#xff0c;遇到不懂的问题积极查找相关资料&#xff0c;而…

基于事件驱动架构构建微服务第14部分:查询API

原文链接&#xff1a;https://logcorner.com/building-micro-services-through-event-driven-architecture-part14-query-api/在本教程中&#xff0c;我将展示如何构建一个查询API&#xff0c;使用命令查询职责分离(CQRS)模式在微服务架构中实现查询。读取模型的目标是构建一个…

Win32窗体实现接受拖拽文件,检测鼠标拖拽操作,检测鼠标滚轮操作

使窗体能够接受文件拖拽 DragAcceptFiles(hwnd, TRUE);文件拖拽在win32窗体过程函数中对WM_DROPFILES消息进行处理 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_DESTROY:PostQuitMessage(0);return 0;case WM_D…

python序列元素的编号称为_Python序列

序列是一块用于存放多个值的连续内存空间,并且按照一定顺序排列,没一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以去除相应的值在Python中,序列结构主要有列表 元组 集合 字典和字符串,对于这些序列结构有以下几个通用的操作.其中,集合和字典不支持索引 切片 相…

​“北斗女神”徐颖,32岁成为中科院最年轻的博导!

全世界只有3.14 % 的人关注了爆炸吧知识来源&#xff1a;学术志被誉为“北斗女神”的徐颖研究员在32岁就成为了中科院最年轻的博士生导师&#xff0c;真是羡煞旁人。一分耕耘一分收获&#xff0c;我们要向为国家做出巨大贡献的科学家学习。徐颖、颜值、气质、才华、幽默集于一身…

通过jQuery源码学习javascript(三)

序承接上两篇继续写下去。我尽量把我明白的地方给大家说清楚。有些大家的提问我也有点搞不明白&#xff0c;如果有人能解答&#xff0c;再好不过了。疑问第一篇中有位博友提出了以下的问题&#xff0c;我也不太明白&#xff0c;如果有明白的&#xff0c;能否告知一、二。var st…