首页
学习
活动
专区
圈层
工具
发布

SQL IN 一定走索引吗?

问题 问题要从之前的统计 店铺数关注人数说起 SELECT shop_id, count(user_Id) as attentionNumber FROM shop_attention WHERE shop_id...阿里云对这个SQL的检测报告时 扫描行数和返回行数比例超过了100 使用了groupby函数,注意检查groupby是否用到了索引 分析 首先可以确定的是,group by 的 shop_id字段肯定是建了索引的...关联查询/范围排序查询时都会使得扫描行数大于返回行数。一般这个比例要控制在10以下,否则可能会有性能问题。 题外话,我一直觉得mysql explain的展示字段不如mongo的直观。...那么就explain 一下了 实验1 SELECT shop_id, count(user_Id) as attentionNumber FROM shop_attention WHERE shop_id...SELECT shop_id, count(user_Id) as attentionNumber FROM shop_attention WHERE shop_id IN(1,2,3,4,5,6,7,8,9

2.2K30

那些年我们一起优化的SQL

并不一定, 当索引使用类型type为range时,都会出现using index condition。...(可以让sql走覆盖索引、非索引排序的情况下也可以促使Mysql使用更优的排序算法) select id from reserve where shop_id=1 and reserve_status...引擎层过滤后会将获取的数据暂存,服务层一条一条数据获取,获取时引擎层回表获得完成数据交给服务层,服务层判断是否匹配查询条件(非索引过滤),如果匹配会继续判断是否满足limit限制的条数。...* FROM shop t1,(select id from reserve limit 1000,100) t2 where t1.id=t2.id 另外,涉及到大数据量的处理,可以按照时间分割查询...排序字段一定要走索引,不走索引数据量大的情况即使select的字段很少也会很慢。 select比较少的字段不仅可以利用到覆盖索引提高速度。

80132
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一条SQL背后的秘密:MySQL执行顺序解析

    如果我们不了解MySQL的执行顺序,就很难理解为什么WHERE后面不能使用SELECT中定义的别名,而HAVING却可以。 1....它首先对FROM子句中的表进行笛卡尔积操作,然后应用ON条件进行过滤。...然后应用ON条件过滤掉不匹配的记录,生成VT2。 实用技巧:当FROM子句包含多个表时,MySQL的执行顺序是从后往前、从右到左。因此,应该将数据量最小的表放在最后面,作为驱动表。...(如关键字SELECT、表名、字段名、条件等),识别每个单元的含义 语法分析:校验 SQL 语法是否符合 MySQL 规范,若语法错误会直接返回报错(如You have an error in your...条件中选择哪个索引、是否使用全表扫描 / 索引扫描等。

    22010

    面试官:如何优化慢SQL?

    我们在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多 SQL 语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的 SQL 就是整个系统性能的瓶颈...* from t where a = 1 and b in (1, 2) order by c";如果走 idx1,那么是 type 为 range,如果走 idx2,那么 type 是 ref;当需要扫描的行数...案例 1:最左匹配 索引: KEY `idx_shopid_orderno` (`shop_id`,`order_no`) SQL 语句: select * from _t where orderno...3.6 案例 6:不等于、不包含不能用到索引的快速搜索 可以用到 ICP: select * from _order where shop_id=1 and order_status not in (1,2...) select * from _order where shop_id=1 and order_status !

    84920

    数据库知识:SQL优化10个经典案例场景实战

    正文 前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL...= 1 and b in (1, 2) order by c";如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时...另一种是采用延迟关联的方式进行处理,减少SQL回表,但是要记得索引需要完全覆盖才有效果,SQL改动如下 select t1.* from _t t1, (select id from _t where...SQL语句 select * from _order where shop_id = 1 and created_at > '2021-01-01 00:00:00' and order_status...(可以用到ICP) select * from _order where shop_id=1 and order_status not in (1,2) select * from _order where

    2.1K60

    10个经典案例,聊聊如何优化慢 SQL

    大家好,我是小富~ 前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多 SQL 语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的 SQL...* from t where a = 1 and b in (1, 2) order by c";如果走 idx1,那么是 type 为 range,如果走 idx2,那么 type 是 ref;当需要扫描的行数...1:最左匹配 索引: KEY `idx_shopid_orderno` (`shop_id`,`order_no`) SQL 语句: select * from _t where orderno='...| 案例 6:不等于、不包含不能用到索引的快速搜索 可以用到 ICP: select * from _order where shop_id=1 and order_status not in (1,2...) select * from _order where shop_id=1 and order_status !

    3.3K31

    面试官问如何优化慢SQL?

    ---- 文章来源:https://c1n.cn/tEsnA 前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多 SQL 语句开始暴露出性能问题,对生产的影响也越来越大...* from t where a = 1 and b in (1, 2) order by c";如果走 idx1,那么是 type 为 range,如果走 idx2,那么 type 是 ref;当需要扫描的行数...1:最左匹配 索引: KEY `idx_shopid_orderno` (`shop_id`,`order_no`) SQL 语句: select * from _t where orderno=''...| 案例 6:不等于、不包含不能用到索引的快速搜索 可以用到 ICP: select * from _order where shop_id=1 and order_status not in (1,2...) select * from _order where shop_id=1 and order_status !

    1K50

    mysql调优哪些事儿

    Rows_sent: 表示 SQL 语句返回的行数。 Rows_examined: 表示查询过程中扫描的行数。如果 SQL 语句没有执行查询操作,则该值为 0。...16M 内存临时表的最大容量为tmp_table_size和max_heap_table_size值的最小值 当所需临时表的容量大于两者的最小值时,mysql就会使用硬盘临时表存放数据 Using where...是我们平时见的最多的,条件查询的时候,进行全表扫描 explain SELECT province,city,STATUS from account where province = '北京市'...,a是varchar类型 select * from table1 where a = 1 select * from table1 where a = '1' 对于varchar类型比较来说,a,b...,一种是没必要走索引,一部分就是没遵循B+树的构建好的排序结构 第一种, 比如字段重复量过多,或者数据量过少,执行优化器认为没必要走索引了,全表扫描会更快, 范围查询的时候,1w行数据,且是select

    69052

    SQL优化场景+案例

    (可以用到ICP) 案例7、优化器选择不使用索引的情况 案例8、复杂查询 案例9、asc和desc混用 案例10、大数据 资料 前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长...= 1 and b in (1, 2) order by c;如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时,...KEY `idx_shopid_orderno` (`shop_id`,`order_no`) SQL语句 select * from _t where orderno='' 查询匹配从左往右匹配...`) SQL语句 SELECT * FROM _order WHERE shop_id = 1 AND created_at > '2021-01-01 00:00:00' AND...(可以用到ICP) select * from _order where shop_id=1 and order_status not in (1,2) select * from _order where

    68540

    SQL优化万能公式:5 大步骤 + 10 个案例

    前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈。...= 1 and b in (1, 2) order by c";如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时...` (`shop_id`, `order_status`, `created_at`) SQL语句 select * from _order where shop_id = 1 and order_status...(可以用到ICP) select * from _order where shop_id=1 and order_status not in (1,2) select * from _order where...另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取! 推荐阅读 在外企工作真的爽吗? 在制造业大厂当程序员是什么感受? 怎么选?

    57330

    场景+案例分析,SQL优化这么做就对了

    (可以用到ICP) 案例7、优化器选择不使用索引的情况 案例8、复杂查询 案例9、asc和desc混用 案例10、大数据 资料 前言 在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长...= 1 and b in (1, 2) order by c;如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时,...KEY `idx_shopid_orderno` (`shop_id`,`order_no`) SQL语句 select * from _t where orderno='' 查询匹配从左往右匹配...另一种是采用延迟关联的方式进行处理,减少SQL回表,但是要记得索引需要完全覆盖才有效果,SQL改动如下 SELECT t1.* FROM _t t1, ( SELECT id FROM _t WHERE...(可以用到ICP) select * from _order where shop_id=1 and order_status not in (1,2) select * from _order where

    52710

    MYSQL优化技巧:5 大步骤 + 10 个案例

    = 1 and b in (1, 2) order by c;如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时,...`) SQL语句 select * from _t where orderno='' 查询匹配从左往右匹配,要使用order_no走索引,必须查询条件携带shop_id或者索引(shop_id,order_no...另一种是采用延迟关联的方式进行处理,减少SQL回表,但是要记得索引需要完全覆盖才有效果,SQL改动如下 SELECT t1.* FROM _t t1, ( SELECT id FROM _t WHERE...语句 SELECT * FROM _order WHERE shop_id = 1 AND created_at > '2021-01-01 00:00:00' AND order_status...(可以用到ICP) select * from _order where shop_id=1 and order_status not in (1,2) select * from _order where

    78120

    count(*)、count(1)和count(column)区别以及执行效率高低比较

    性能问题:   1、任何情况下 SELECT COUNT(*) FROM tablename 是最优选择;   2、尽量减少 SELECT COUNT(*) FROM tablename WHERE COL...= 'value' 这种查询;   3、杜绝 SELECT COUNT(COL) FROM tablename WHERE COL2 = 'value' 的出现。   ...如果表只有一个字段,count(*)最快。 count(1)跟count(主键)一样,只扫描主键。 count(*)跟count(非主键)一样,扫描整个表。...执行效率:   它们三个的效率如何呢?网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。...测试:   我用100万数据进行测试,发现当且仅当三者有主键时,他们的执行时间几乎相等。

    3.3K40

    【愚公系列】《网络安全应急管理与技术实践》 012-网络安全应急技术与实践(Web层-SQL注入)

    一、SOL注入攻击分析与应急演练1.SOL注入种类SQL注入攻击是通过将恶意的SQL代码注入到Web应用程序的输入字段中,以绕过应用程序的输入验证并直接访问和执行数据库的攻击方式。...如果在注入点处出现错误信息或页面内容的变化,且注入点处的数据可以影响响应信息的内容,那么很可能存在布尔型盲注。注入点位:在确定注入点时,可以通过手工测试或使用工具扫描程序来发现是否存在布尔型盲注。...错误信息:当攻击者进行盲注测试时,如果系统返回的错误信息与平时不同,可能存在时间型盲注。追踪日志:追踪数据库日志,查看是否有异常的查询和响应时间。...应用程序使用以下SQL查询语句进行验证:SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';攻击者可以通过在用户名字段中注入恶意的...这里将关键词union中的u大写,当select、fom 和 where 每个关键词都有一个字母大写后就可以成功绕过限制)。

    59520

    SQL优化中新建索引真的比Explain好?面试官:你出去吧

    也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。...(image-417577-1609248374529)] 通过Explain关键字,可以看出来每个查询扫描的行数,用到了哪个索引等等,下面文章,会讲每个字段的意思,然后看下如何优化。。。。。。...ref ref:常见的有:const,func,null,字段名。 当使用常量等值查询,显示const。当关联查询时,会显示相应关联表的关联字段。...EXPLAIN SELECT shop_id FROM s_goods WHERE cat_id IN (1,2,3,4) GROUP BY shop_id; [图片上传失败......EXPLAIN SELECT * FROM s_goods ORDER BY shop_id; ? image.png Using join buffer:关联字段没有用到索引的话,会显示这个。

    69410

    MySQL联合索引:深度解析与最佳实践指南

    * FROM table WHERE col2 = 'value' AND col3 = 'value'; -- 优化器可能将查询重写为: -- SELECT * FROM table WHERE col1...MRR) 关键改进: -- MySQL 5.6+ 索引条件下推 SELECT * FROM table WHERE a = 'x' AND b LIKE '%y%'; -- ICP允许在索引层过滤...索引跳跃扫描:如前所述 三、核心设计原则:三层次决策模型 第一层:需求分析(决定是否需要联合索引) 需要联合索引的场景矩阵: 查询模式 推荐索引类型 示例 多列等值查询 联合索引 WHERE a=...索引合并策略 当无法使用单一联合索引时,优化器可能选择合并多个索引: -- 查询条件 WHERE a = 1 OR b = 2 -- 索引设计 INDEX idx_a (a) INDEX idx_b...20; -- 查询2:店铺订单管理(高频) SELECT * FROM orders WHERE shop_id = 1001 AND status IN (1,2,3) AND create_time

    33010
    领券