MySQL 搜索指定时间范围数据, 时间字段有索引但是还是很费时

问题分析

  • 所遇情况:

    1. 数据库版本:5.6.38
    2. 查询时使用时间类型,在status、closed、playback_state字段上都有索引
    3. 几种查询语句
      explain (select count(*)
               from session
               where status = 2
                 and playback_state = 1
                 and closed > ‘2018/10/17‘
                 and closed < ‘2018-10-18‘);
      explain (select count(*)
               from session
               where status = 2
                 and playback_state = 1
                 and closed like ‘2018-10-17%‘);
      explain (select count(*)
               from session
               where status = 2
                 and playback_state = 1
                 and closed > 1539705600
                 and closed < 1539792000);
      explain (select count(*)
               from session
               where status = 2
                 and playback_state = 1
                 and closed > unix_timestamp(‘2018/10/17‘)
                 and closed < unix_timestamp(‘2018-10-18‘));
    4. 查询情况:第一种情况使用closed的索引,查询速度很快. 其他使用playback_state,因为playback_state相同的数据有很多,因此除第一种情况外,其他情况都很糟糕。
  • 为什么其他几种情况未使用closed进行索引:

    1. mysql查询时,不管有多少个单个索引或联合索引,永远只使用一个索引。
    2. 具体使用哪个索引进行查询,由mysql进行选择,会选择一个它认为最合适的一个字段。在以上情况中,其选择了playback_state,而非closed。
  • 应对方案:

    1. 当语句执行太长时间,使用explain看一下查询情况,mysql是否使用了正确的索引。
    2. 在有索引的字段上使用函数是会把索引去掉的。
    3. 可以使用use index强制mysql使用固定索引
    4. 可以考虑使用联合索引(开发不能随意改动数据库的表结构)

原文地址:https://www.cnblogs.com/Zereker/p/11396623.html

时间: 2024-10-03 22:47:48

MySQL 搜索指定时间范围数据, 时间字段有索引但是还是很费时的相关文章

MySQL忽略已重复数据强制创建唯一索引

常规方法: CREATE UNIQUE INDEX `idx_m2b_product_photo_pid_sort` ON `m2b`.`m2b_product_photo` (pid, sort) COMMENT '' ALGORITHM DEFAULT LOCK DEFAULT; 忽略已重复数据强制创建唯一索引的方法: ALTER IGNORE TABLE `m2b_product_photo` ADD UNIQUE `idx_m2b_product_photo_pid_sort` (`pi

mysql取出指定范围数据limit offset分析与运用

传统写法 limit 偏移量,取出条数 SELECT * FROM yundou_management.service_order where order_status=1 order by id asc limit 108,8 ; mysql5之后支持新写法,让人更容易理解 limit 取出条数 offset 偏移量 SELECT * FROM yundou_management.service_order where order_status=1 order by id asc limit

MySQL插入10万数据时间

记录我的一次MySQL操作Demo: 存储过程: DROP PROCEDURE IF EXISTS my_insert; CREATE PROCEDURE my_insert() BEGIN DECLARE n int DEFAULT 1; loopname:LOOP INSERT INTO user_info(id,name,age,gender,address,tel)VALUES(n,'lilis',16,2,'杭州下沙',18758); SET n=n+1; IF n=100000 TH

mysql 判断指定条件数据存不存在,不存在则插入

折腾了半天终于把这个给折腾顺了,但是后来发现用不了竟然...悲剧啊,但是还是要记录下加深记忆 insert into table1 (field1, field2,field3) select ?field1,?field2,?field3 from temp where not exists (select field1,field2,field3 from table1 where field1=?field1 and field2=?field2 and field3=?field3);

超实用--删除MYSQL中指定的数据的全部表

作过的人都知道,重复测试数据库的苦恼. 用法:# Usage: ./script user password dbnane mysql.nixcraft.in ~~~~~~~~~~~~~ #!/bin/bash # 删除mysql中所有表 # 示例: # Usage: ./script user password dbnane # Usage: ./script user password dbnane server-ip # Usage: ./script user password dbna

【mybatis】 mybatis在mysql 更新update 操作 更新时间字段按照年月日时分秒格式 更新为当前时间

示例代码如下: update goods_msg SET create_date = DATE_FORMAT(NOW(),'%Y-%m-%d %H:%m:%s') WHERE uid = '6183b000-e7b3-4f38-8943-c9f170bd2d80' 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/9158888.html

MySQL时间字段究竟使用INT还是DateTime的说明

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

MySQL基于时间字段进行分区的方案总结

MySQL支持的分区类型一共有四种:RANGE,LIST,HASH,KEY.其中,RANGE又可分为原生RANGE和RANGE COLUMNS,LIST分为原生LIST和LIST COLUMNS,HASH分为原生HASH和LINEAR HASH,KEY包含原生KEY和LINEAR HASH.关于这些分区之间的差别,改日另写文章进行阐述. 最近,碰到一个需求,要对表的时间字段(类型:datetime)基于天进行分区.于是遍历MySQL官方文档分区章节,总结如下: 实现方式 主要是以下几种: 1.

MySQL时间字段究竟使用INT还是DateTime

今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非