iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql优化器对in list的处理
  • 137
分享到

Mysql优化器对in list的处理

2024-04-02 19:04:59 137人浏览 八月长安
摘要

select * from table where id in (....)这样的查询,是走范围索引还是走等值索引? select * from table where

select * from table where id in (....)
这样的查询,是走范围索引还是走等值索引?
select * from table where key_part1 in (....) and key_part2='XX';
这样的查询,第二部分还走不走索引?

测试目的,想知道,Mysql对IN LIST是如何选择执行计划的;在单字段索引和复合索引中;

[@more@]


mysql 5.1.40
os:rhel 5.4
engine=innodb
innodb_file_per_table


# 先来创建测试环境:
create table index_test ( id int auto_increment , col1 int ,col2 varchar(200) ,content varchar(500),primary key (id) ,key col1 (col1) ) engine=innodb default charset=latin1;
# repeat insert operation 12 times

insert into index_test (col1,col2) select @rownum:=@rownum+1,column_name from infORMation_schema.COLUMNS c , (select @rownum:=0 ) id limit 500 ;


# 测试1:先测对主键的IN操作;

# 测试用例:
reset query cache; --清空QUERY_CAHCE
show status like 'Innodb_buffer_pool_read_requests' ; --用来查询逻辑读
select * from index_test where id in (2,10,1000,2000,9000);
show status like 'Innodb_buffer_pool_read_requests' ; --与前面的结果相减,就得到sql执行所带来的逻辑读 ;
为了逻辑读的准确性, 对同一个SQL你应该多跑几次,以去掉物理读 ;


root@127.0.0.1 : test 16:02:16> explain select * from index_test where id in (2,10,1000,2000);
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | index_test | range | PRIMARY | PRIMARY | 4 | NULL | 4 | Using where |
+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+
1 row in set (0.00 sec)

# 从执行计划看,走的是范围条件;但我们看看实际情况 :
# 注意,为了减少篇幅,我把各个查询的结果给删减了。


select * from index_test where id in (2,10);
RESULTs: 2 rows
LIO  : 4

select * from index_test where id in (2,1000);
RESULTs: 2 rows
LIO  : 4

select * from index_test where id in (2,10,100);
RESULTs: 3 rows
LIO  : 6

select * from index_test where id in (2,10,1000,2000);
RESULTs: 4 rows
LIO  : 8

select * from index_test where id in (2,10,1000,2000,9000);
RESULTs: 5 rows
LIO  : 10

### 在这里看到,逻辑读根据IN LIST里KEY的数量成线性增加,而没有根据KEY值的大小变化,所以我们判断,对主键的IN操作,其实都转成了OR操作。


# 测试2:对非主键的IN操作;
# 测试用例:
reset query cache;
show status like 'Innodb_buffer_pool_read_requests' ;
select * from index_test where col1 in (100,500,300,400);
show status like 'Innodb_buffer_pool_read_requests' ;


root@127.0.0.1 : test 16:06:33> explain select * from index_test where col1 in (100,200);
+----+-------------+------------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | index_test | range | col1 | col1 | 5 | NULL | 24 | Using where |
+----+-------------+------------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

select * from index_test where col1 in (100,101);
RESULTs: 24 rows
LIO : 86

select * from index_test where col1 in (100,500);
RESULTs: 24 rows
LIO : 86

select * from index_test where col1 in (100,500,300);
RESULTs: 36 rows
LIO : 139

select * from index_test where col1 in (100,500,300,400);
RESULTs: 48 rows
LIO : 172

分析: 这个结果与测试1的结果是一样的;


# 测试3:对复合索引的前列IN操作;
alter table index_test drop index col1 ,add index col1col2(col1,col2) ;
update index_test set content=concat(col2,col3,col1) ;

主要是测一下,索引的第一个字段用IN后,优化器还会不会使用第二个字段来进行索引搜索;

root@127.0.0.1 : test 18:41:38> explain select content from index_test where col1 in (100,500,300,400) and col2='aaaa';
+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+
| 1 | SIMPLE | index_test | range | col1col2 | col1col2 | 208 | NULL | 4 | Using where |
+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+
1 row in set (0.00 sec)



select count(*) from index_test where col1 in (100,500,300,400) and col2='aaaa';
RESULTs: 0 rows
LIO : 24

select content from index_test where col1 in (100,500,300,400) and col2='aaaa';
RESULTs: 0 rows
LIO : 24

分析:
#我们发现,两个查询的逻辑读是一样,其实这已经表明优化器用上了索引的第二个字段,在索引搜索部分就完成了对COL2的过滤;

总结:MYSQL优化器对in list是转成“or” 的“多个等值”查询来处理的;并没有转成范围查询 ;

您可能感兴趣的文档:

--结束END--

本文标题: Mysql优化器对in list的处理

本文链接: https://www.lsjlt.com/news/49742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql优化器对in list的处理
    select * from table where id in (....)这样的查询,是走范围索引还是走等值索引? select * from table where...
    99+
    2022-10-18
  • 通过IN换INNER JOIN实现对mysql的优化
    不知道大家之前对类似通过IN换INNER JOIN实现对mysql的优化的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完通过IN换INNER JOIN实现对mysq...
    99+
    2022-10-18
  • MySQL的优化器对于count(*)的处理方式是什么
    今天就跟大家聊聊有关MySQL的优化器对于count(*)的处理方式是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获...
    99+
    2022-10-19
  • Mysql中怎么进行优化器对子查询的处理
    本篇文章给大家分享的是有关Mysql中怎么进行优化器对子查询的处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。根据子查询的类型和位置不同,m...
    99+
    2022-10-18
  • CentOS Firefox怎样针对特定的处理器进行优化
    本篇文章为大家展示了CentOS Firefox怎样针对特定的处理器进行优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。将 CentOS Firefox 针对特定的处理器进行优化之后便是 Cent...
    99+
    2023-06-16
  • Java中自然语言处理:Apache对象是如何优化处理语言的?
    随着信息技术的快速发展,自然语言处理(NLP)已经成为当前研究的热点之一。NLP可以帮助我们更好地理解和处理人类语言,从而实现更高效的信息交流和处理。在Java中,Apache对象库是NLP处理的一个重要工具,它提供了丰富的NLP处理功能...
    99+
    2023-08-29
    自然语言处理 对象 apache
  • PHP并发处理:如何优化对象的Shell脚本实现?
    在现代计算机应用程序中,处理并发任务已经成为一个非常重要的任务。对于PHP来说,处理并发任务有很多种方式,其中一种比较常见的方式是通过Shell脚本来实现。本文将介绍如何使用Shell脚本来实现PHP并发处理,并提供一些优化技巧。 一、S...
    99+
    2023-10-22
    对象 并发 shell
  • 站群服务器对网站优化的好处有哪些
    站群服务器对网站优化的好处有:1.增加搜索引擎的收录,提高收录率;2.提升网站排名,提高网站权重;3.确保网站独立性,独立ip;4.避免受牵连,提高网站完全性;具体分析如下:增加搜索引擎的收录站群服务器多个ip资源能够充分配备到每个网站,让...
    99+
    2022-10-05
  • 如何使用分区处理MySQL的亿级数据优化
    mysql在查询上千万级数据的时候,通过索引可以解决大部分查询优化问题。但是在处理上亿数据的时候,索引就不那么友好了。 数据表(日志)是这样的: 表大小:1T,约24亿行; 表分区:按时间分区,每个...
    99+
    2022-05-11
    mysql 亿级处理数据 MySQL分区亿级数据
  • PostgreSQL查询优化中对Having和Group By子句的简化处理分析
    这篇文章主要介绍“PostgreSQL查询优化中对Having和Group By子句的简化处理分析”,在日常操作中,相信很多人在PostgreSQL查询优化中对Having和Group ...
    99+
    2022-10-19
  • MySQL中的查询优化器工作原理解析
    MySQL是一种常用的关系型数据库管理系统,广泛应用于各种Web应用程序和大型企业级系统中。在MySQL的日常使用中,查询语句是最常见和重要的操作之一。为了提高查询效率和性能,MySQL引入了查询优化器。查询优化器是MySQL内部的一个组件...
    99+
    2023-10-22
    查询优化器 MySQL中 工作原理解析
  • MySQL查询优化器的工作原理是什么
    本篇内容介绍了“MySQL查询优化器的工作原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  My...
    99+
    2022-10-18
  • Python中如何优化HTTP请求和大数据对象的处理?
    Python是一种广泛使用的编程语言,它支持各种网络协议和数据处理。在网络开发和数据处理中,HTTP请求和大数据对象的处理是非常常见的问题。本文将介绍一些Python中的优化技巧,以便更高效地处理HTTP请求和大数据对象。 一、HTTP请求...
    99+
    2023-10-21
    http 大数据 对象
  • Linux环境下如何优化PHP中的数组和对象处理?
    在Linux环境下使用PHP进行开发时,数组和对象的处理是非常常见的操作。然而,如果不加以优化,在处理大量数据时,会导致性能下降,甚至崩溃。本文将介绍一些在Linux环境下优化PHP中数组和对象处理的方法,以提高代码的性能。 一、使用正确的...
    99+
    2023-08-24
    linux 数组 对象
  • 如何实现MySQL底层优化:查询优化器的工作原理及调优方法
    如何实现MySQL底层优化:查询优化器的工作原理及调优方法在数据库应用中,查询优化是提高数据库性能的重要手段之一。MySQL作为一种常用的关系型数据库管理系统,其查询优化器的工作原理及调优方法十分重要。本文将介绍MySQL查询优化器的工作原...
    99+
    2023-11-08
    MySQL 查询优化器 调优方法。
  • PHP 实时编程算法中,如何优化对象的处理效率?
    PHP 是一种广泛应用于 Web 开发的编程语言,而实时编程算法的处理效率对于大多数 Web 应用程序都至关重要。优化对象的处理效率是实时编程算法中的一个重要问题,因为对象是 PHP 中最常见的数据类型之一。在本文中,我们将探讨 PHP 实...
    99+
    2023-11-13
    实时 编程算法 对象
  • 租用香港服务器对网站的优化有什么好处
    租用香港服务器对网站优化的好处:1、租用香港服务器会加快网站的打开速度,从而给予用户良好的体验感,使百度蜘蛛的抓取更加友好;2、香港服务器地理位置距离大陆比较近,访问延迟在40ms左右,相对其他海外服务器而言,使用香港服务器稳定性更加强。具...
    99+
    2022-10-07
  • PostgreSQL查询优化中对消除外连接的处理过程是什么
    本篇内容介绍了“PostgreSQL查询优化中对消除外连接的处理过程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2022-10-19
  • 深入了解MySQL中索引优化器的工作原理
    目录本文导读一、mysql 优化器是如何选择索引的1、MySQL数据库组成2、MySQL数据库成本计算二、MySQL查询成本三、SELECT 执行过程总结本文导读 本文将解读MySQL数据库查询优化器(CBO)的...
    99+
    2022-11-09
  • 如何理解MySQL的查询执行计划和优化器?
    如何理解MySQL的查询执行计划和优化器?概述:MySQL是最常用的开源关系型数据库之一,其查询执行计划和优化器是MySQL查询性能优化的关键。了解和理解MySQL的查询执行计划和优化器可以帮助我们优化查询语句,提高数据库的性能。本文将介绍...
    99+
    2023-10-22
    MySQL查询 执行计划 优化器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作