精华内容
下载资源
问答
  • mysql in查询保持in集合顺序

    千次阅读 2017-06-13 15:49:18
    mysql使用in查询的时候,如果要保持查询结果的顺序和in集合的顺序一致的话,可以使用field  例如: select * from table where id IN (3,6,9,1,2,5,8,7);  查询的结果是按照id值升序排列的,如果要保持in集合...

      在mysql使用in查询的时候,如果要保持查询结果的顺序和in集合的顺序一致的话,可以使用field

      例如:

    select * from table where id IN (3,6,9,1,2,5,8,7);

      查询的结果是按照id值升序排列的,如果要保持in集合的顺序的话,可以改成

      select * from table where id IN (3,6,9,1,2,5,8,7) order by field(id,3,6,9,1,2,5,8,7); 

      

    展开全文
  • mysql in 查询in的顺序来排序

    千次阅读 2019-04-08 07:52:14
    如果按in查询时,想让结果记录按照in里的记录顺序排序。 举例:SQL: select * from table where id IN (3,9,6); 查询结果的属性,会按记录id 3、6、9的顺序配置。这时我想让记录按照in里的3、9、6来排序。 mysql...

    一个小知识点

    如果按in查询时,想让结果记录按照in里的记录顺序排序。

    举例:SQL: select * from table where id IN (3,9,6);

    查询结果的属性,会按记录id 3、6、9的顺序配置。这时我想让记录按照in里的3、9、6来排序。

    mysql为我们提供了这个功能:SQL select * from table where id IN (3,9,6) order by field(id,3,9,6);

    语法:FIELD(str,str1,str2,str3,…)

    但是有文章指出这样的写法有性能问题,所有简单的场景可以应用,如果记录太多,请谨慎使用。

    关于性能的问题:

    “Returns the index (position) of str in the str1, str2, str3, … list. Returns 0 if str is not found.
    排序过程:把选出的记录的 id 在 FIELD 列表中进行查找,并返回位置,以位置作为排序依据。
    这样的用法,会导致 Using filesort,是效率很低的排序方式。除非数据变化频率很低,或者有长时间的缓存,否则不建议用这样的方式排序。“
    使用explain测试会导致using filesort。就可以采用其他方式了。

    展开全文
  • mysql in 查询效率慢优化

    万次阅读 2017-02-19 21:40:06
    mysql> select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839'); 为了节省篇幅,省略了输出内容,下同。 67 rows in set (12.00 sec) 只有67...

    mysql> select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');

    为了节省篇幅,省略了输出内容,下同。

    67 rows in set (12.00 sec)


    只有67行数据返回,却花了12秒,而系统中可能同时会有很多这样的查询,系统肯定扛不住。用desc看一下(注:explain也可)


    mysql> desc select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');
    +----+--------------------+------------------+--------+-----------------+-------+---------+------------+---------+--------------------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+--------------------+------------------+--------+-----------------+-------+---------+------------+---------+--------------------------+
    | 1 | PRIMARY | abc_number_prop | ALL | NULL | NULL | NULL | NULL | 2679838 | Using where |
    | 2 | DEPENDENT SUBQUERY | abc_number_phone | eq_ref | phone,number_id | phone | 70 | const,func | 1 | Using where; Using index |
    +----+--------------------+------------------+--------+-----------------+-------+---------+------------+---------+--------------------------+
    2 rows in set (0.00 sec)


    从上面的信息可以看出,在执行此查询时会扫描两百多万行,难道是没有创建索引吗,看一下


    mysql>show index from abc_number_phone;
    +------------------+------------+-------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +------------------+------------+-------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | abc_number_phone | 0 | PRIMARY | 1 | number_phone_id | A | 36879 | NULL | NULL | | BTREE | | |
    | abc_number_phone | 0 | phone | 1 | phone | A | 36879 | NULL | NULL | | BTREE | | |
    | abc_number_phone | 0 | phone | 2 | number_id | A | 36879 | NULL | NULL | | BTREE | | |
    | abc_number_phone | 1 | number_id | 1 | number_id | A | 36879 | NULL | NULL | | BTREE | | |
    | abc_number_phone | 1 | created_by | 1 | created_by | A | 36879 | NULL | NULL | | BTREE | | |
    | abc_number_phone | 1 | modified_by | 1 | modified_by | A | 36879 | NULL | NULL | YES | BTREE | | |
    +------------------+------------+-------------+--------------+-----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    6 rows in set (0.06 sec)

    mysql>show index from abc_number_prop;
    +-----------------+------------+-------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +-----------------+------------+-------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | abc_number_prop | 0 | PRIMARY | 1 | number_prop_id | A | 311268 | NULL | NULL | | BTREE | | |
    | abc_number_prop | 1 | number_id | 1 | number_id | A | 311268 | NULL | NULL | | BTREE | | |
    | abc_number_prop | 1 | created_by | 1 | created_by | A | 311268 | NULL | NULL | | BTREE | | |
    | abc_number_prop | 1 | modified_by | 1 | modified_by | A | 311268 | NULL | NULL | YES | BTREE | | |
    +-----------------+------------+-------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    4 rows in set (0.15 sec)


    从上面的输出可以看出,这两张表在number_id字段上创建了索引的。


    看看子查询本身有没有问题。

    mysql> desc select number_id from abc_number_phone where phone = '82306839';
    +----+-------------+------------------+------+---------------+-------+---------+-------+------+--------------------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+------------------+------+---------------+-------+---------+-------+------+--------------------------+
    | 1 | SIMPLE | abc_number_phone | ref | phone | phone | 66 | const | 6 | Using where; Using index |
    +----+-------------+------------------+------+---------------+-------+---------+-------+------+--------------------------+
    1 row in set (0.00 sec)


    没有问题,只需要扫描几行数据,索引起作用了。查询出来看看

    mysql> select number_id from abc_number_phone where phone = '82306839';
    +-----------+
    | number_id |
    +-----------+
    | 8585 |
    | 10720 |
    | 148644 |
    | 151307 |
    | 170691 |
    | 221897 |
    +-----------+
    6 rows in set (0.00 sec)


    直接把子查询得到的数据放到上面的查询中

    mysql> select * from abc_number_prop where number_id in (8585, 10720, 148644, 151307, 170691, 221897);

    67 rows in set (0.03 sec)


    速度也快,看来MySQL在处理子查询的时候是不够好。我在MySQL 5.1.42 和 MySQL 5.5.19 都进行了尝试,都有这个问题。


    搜索了一下网络,发现很多人都遇到过这个问题:

    参考资料1:使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
    http://blog.csdn.net/hongsejiaozhu/article/details/1876181
    参考资料2:网站开发日记(14)-MYSQL子查询和嵌套查询优化
    http://dodomail.iteye.com/blog/250199

    根据网上这些资料的建议,改用join来试试。

    修改前:select * from abc_number_prop where number_id in (select number_id from abc_number_phone where phone = '82306839');

    修改后:select a.* from abc_number_prop a inner join abc_number_phone b on a.number_id = b.number_id where phone = '82306839';


    mysql> select a.* from abc_number_prop a inner join abc_number_phone b on a.number_id = b.number_id where phone = '82306839';

    67 rows in set (0.00 sec)


    效果不错,查询所用时间几乎为0。看一下MySQL是怎么执行这个查询的


    mysql>desc select a.* from abc_number_prop a inner join abc_number_phone b on a.number_id = b.number_id where phone = '82306839';
    +----+-------------+-------+------+-----------------+-----------+---------+-----------------+------+--------------------------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+-------+------+-----------------+-----------+---------+-----------------+------+--------------------------+
    | 1 | SIMPLE | b | ref | phone,number_id | phone | 66 | const | 6 | Using where; Using index |
    | 1 | SIMPLE | a | ref | number_id | number_id | 4 | eap.b.number_id | 3 | |
    +----+-------------+-------+------+-----------------+-----------+---------+-----------------+------+--------------------------+
    2 rows in set (0.00 sec)


    小结:当子查询速度慢时,可用JOIN来改写一下该查询来进行优化。

    展开全文
  • mysql IN 查询的时候索引不起作用

    千次阅读 2018-12-05 10:05:16
    1. 如果字段类型为字符串,需要给in查询中的数值与字符串值都需要添加引号,索引才能起作用。 2. 如果字段类型为int,则in查询中的值不需要添加引号,索引也会起叙用。 IN的字段,在联合索引中,按以上方法,也会...

    其实很简单,索引是否起叙用,主要取决于字段类型:

    1. 如果字段类型为字符串,需要给in查询中的数值与字符串值都需要添加引号,索引才能起作用。

    2. 如果字段类型为int,则in查询中的值不需要添加引号,索引也会起叙用。

    IN的字段,在联合索引中,按以上方法,也会起作用。

    3.mysql查询优化器认为全表扫描时如果速度大于使用索引,就会不用索引,你可以使用FORCE INDEX强制mysql使用索引

    展开全文
  • mysql in查询的执行过程

    千次阅读 2017-03-21 09:23:17
    select * from table1 where id in ( select uid from table2 ); 眨眼一看感觉这条语句应该很快;可能你会一厢情愿的以为 先执行括号里面的语句,然后在执行外层的select;外层的select用上...
  • mysql in 查询的时候索引不起作用

    千次阅读 2019-06-06 14:13:37
    1. 如果字段类型是字符串,需要给in查询中的 数值与 字符串值 都需要添加 ' ' 引号 ,索引才能起作用。 2. 如果字段类型为int,则in查询中的值不需要添加引号,索引也会起叙用。 IN的字段,在联合索引中,按以上...
  • SELECT * FROM project_celiangbuwei where clbwid in ( 7 , 11 , 20 , 4 )  则输出结果为: 4 净胸围 7 净臀围 11 肩宽 20 横裆 使用Field函数排序后: SQL: SELECT * FROM project_celiangbuwei ...
  • mysql in根据查询id排序

    千次阅读 2013-12-12 15:10:30
    要用到order by field,下面用几个例子来说明一下mysql in查询排序   例子: www.2cto.com     SQL:select * from table where id IN (3,6,9,1,2,5,8,7);   这样的情况取出来后,其实,id还是按1,2,3,4,5
  • MySQL查询语句in查询的优化

    万次阅读 多人点赞 2018-08-28 16:16:07
    项目中有需要,使用MySQLin查询查询符合in查询集合中条件的数据,但是没想到的是,MySQLin查询会如此的慢,让人无法接收,于是上网搜索解决办法,下面记录下: 一、原始in查询 SELECT * FROM basic_...
  • 今天使用 MySQL 的 not in 进行查询的时候,发现结果里面并没有返回任何数据。SQL 语句没有任何问题,但是结果集却是空,实在无法理解。纠结了半天,最后使用 left join,两表关联,找到了目标数据。但是这样的话,...
  • Mysql IN查询优化

    千次阅读 2019-03-21 16:43:29
    最近项目里有个SQL查询,使用到 in查询,发现查询很慢,详细如下: 1、原始SQL 子查询里只查询出5条记录,但外层却对全表做扫描,感觉没用上索引。数据大的时候,可想而知。 2、解决方法 网上找到有2种...
  • mysqlin查询是可以用到索引吗?亲测详解

    万次阅读 热门讨论 2019-04-09 17:41:19
    后来陆陆续续看到很多博客,有的说in查询可以用索引,有的说不能用索引,所以博主就越发好奇起来。到底能不能用索引,绝对有个正确的答案,而不是这样的模棱两可。 二、in查询的一些总结     &...
  • 最近在做一个MySQL数据库的查询查询出指定时间之后凡是上传过图片的用户所在的镇和镇的管理员名),查询语句如下: SELECTDISTINCTuser_name,town_nameFROMt_farmersWHEREidIN (SELECTDISTINCTfarmer_idFROMt_...
  • MySQL in 模糊查询问题的解决方法

    千次阅读 2019-01-17 15:38:48
    MySQL 单字段多关键词模糊查询 SELECT A.* FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(需要拆分为行的字符串,’,’,help_topic_id+1),’,’,-1) AS content FROM mysql.help_topic WHERE help_topic_id &...
  • MySQL 查询in操作,查询结果按in集合顺序显示 复制代码 代码如下: select * from test where id in(3,1,5) order by find_in_set(id,'3,1,5'); select * from test where id in(3,1,5)
  • MySQL范围查询 IN 使用注意事项

    千次阅读 2019-08-26 12:15:41
    当我们在做数据库查询优化时,可能会用到范围查询如 BETWEEN, IN 等语句,这里记录一次在项目中使用 IN 查询 IN 后边包含 NULL 值时导致查询结果错误的问题 为了避免查询结果不准确,在使用 `IN` / `NOT IN` 进行...
  • MySqlin查询效率低的替代方法

    万次阅读 2018-12-18 00:16:28
    在项目中,有一个in查询效率很低,耗时大概10多秒,修改后为1秒左右,本来想造一组数据展现效果的,发现实际情况比较复杂,跟具体的关联数据类型、列是否有索引等相关,实际情况并不是某种查询就肯定比另一种查询...
  • mysql查询保持in的顺序

    千次阅读 2018-03-16 18:00:00
    目的:解决mysqlin语法查询顺序问题mysql数据库总,使用in语句查询查询结果默认会根据主键id排序。示例:SELECT * FROM user_seller where store_id IN(1816,1817,1815,1813);运行结果如下:如果想按照in()里的...
  • MySQL 数据库 in查询排序 order by FIND_IN_SET(id,'1,2');
  • mySQLmysql数据库分页查询讨论专题

    万次阅读 多人点赞 2019-05-05 14:36:37
    MySQL:limit分页公式、总页数公式 1) limit分页公式 (1)limit分页公式:curPage是当前第几页;pageSize是一页多少条记录 limit (curPage-1)*pageSize,pageSize (2)用的地方:sql语句中 select * from student...
  • MySQL使用exists优化in查询

    千次阅读 2018-03-19 11:46:08
    MySQL 优化时,总是说在某些情况下要用 exists 代替 in,下面我会介绍一下,exists 替换 in 时需要注意的问题。 1、创建表结构 # 用户信息表 CREATE TABLE `user_info` ( `id` CHAR (36) NOT NULL, `name` ...
  • Mysql使用IN查询导致索引失效的情况

    万次阅读 2019-05-22 19:07:07
    一直以为Mysq使用In查询,参数数量不是太多的情况下,是可以继续走索引的方式。但是事实是: 创建的索引有: 奇葩不,检查了下,字段属性类型都是Int类型,是一致的。但是执行计划中的“Key”对应的值却是空的...
  • mysql查询

    万次阅读 多人点赞 2019-04-22 16:56:01
    MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。 具体环境中,运行时间超过long_query_time值的SQL语句,则会被记录到慢查询日志中。 long_query_time的...
  • mysql in查询无效问题

    千次阅读 2018-01-30 15:09:22
    1. 无效 select * from term_info ...and term_no not in ( select GROUP_CONCAT(term_no) from p_info where company_no = 2 and id != 1 ) 2. 有效 select *
  • mysql使用in查询,按照期望的顺序输出结果,可以使用field函数
  • mysql关于in查询索引

    千次阅读 2019-03-31 00:37:23
    今天和大家看下关于子查询索引的问题. 我本地是5.6版本 这是我的数据结构和表定义 CREATE TABLE test ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(191) COLLATE utf8mb4_unicode_ci NOT ...
  • 关于mybatis和mysqlin查询

    千次阅读 2016-12-07 18:23:51
    mysqlin查询缺陷: 比如说你的数据库的字段有‘1,2,3’,‘1,2’,‘1,3’,‘2,3’,‘1’,‘2’,‘3’ 现在你的查询条件是‘2,3’,你会发现,不仅‘2,3’的被查出来,‘1,3’的也被查出来了 刚开始想到了一...
  • MYSQL 特殊查询收录

    万次阅读 2021-03-12 11:19:03
    1.mysql 8.0 查询所有数据库占用数据大小 use mysql; SELECT table_schema AS "Database Name", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size in (MB)" FROM information_schema.TABLES ...
  • mysql查询in,返回结果集合失败

    千次阅读 2018-10-24 15:20:38
    SELECT * FROM station_quality_detail_info qa INNER JOIN station_info sinfo on qa.station_info_id = sinfo.id WHERE FIND_IN_SET(sinfo.serial_no,(#{...假设stationIds为1,2 查询只会查询出一条...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 796,949
精华内容 318,779
关键字:

MYSQLin查询