把两个单独的索引合并成一个组合索引,即把where条件字段的索引和group by的分组字段索引组合成一个。

如果分组的字段需要用函数处理,可以用索引函数

Generated Column(函数索引)

mysql5.7版本,函数索引用虚拟列,virtual是查询时在内存中计算,而store是计算好后存放在磁盘中。一般作为索引,默认用virtual。

语法:

<type> [ GENERATED ALWAYS ] AS ( <expression> ) [ VIRTUAL|STORED ] [ UNIQUE [KEY] ] [ [PRIMARY] KEY ] [ NOT NULL ] [ COMMENT <text> ]

修改table添加一个新列,由函数处理已有字段自动生成。

新建虚拟列

 ALTER TABLE tblName ADD virtualField varchar(50) GENERATED ALWAYS AS (FROM_UNIXTIME(bus_remind.arrivingTimeStamp)) virtual;

删除虚拟列

alter table tblName drop column fieldName;

例子

组合索引如下

sql语句

SELECTavg(arrivingBattery) AS battery
FROMbus_remind
WHEREparkingCode = '101001'
GROUP BY DATE_FORMAT( FROM_UNIXTIME(arrivingTimeStamp ), '%Y-%m-%d %H:%i' )

explain结果

分析原因:

分组字段根据分钟分组(对字段进行函数处理)导致抛弃索引。

解决方案:

复合索引使用虚拟列技术,将虚拟列作为索引,Sql如下

/*创建*/
ALTER TABLE bus_remind ADD virtualArrivingTimeStamp char(16) GENERATED ALWAYS AS (DATE_FORMAT(FROM_UNIXTIME(arrivingTimeStamp),'%Y-%m-%d %H:%i')) VIRTUAL comment '来车时间函数索引列';
/*删除*/
alter table bus_remind drop column virtualArrivingTimeStamp

复合索引更改为(版本必须为5.7及以上)

sql语句更改

SELECTavg(arrivingBattery) AS battery
FROMbus_remind
WHEREparkingCode = '101001'
GROUP BY virtualArrivingTimeStamp

explain结果

原文链接

官方链接

转载于:https://www.cnblogs.com/aeolian/p/10216362.html

用where导致group by分组字段的索引失效相关推荐

  1. Mysql多表关联时因关联字段类型不一致导致索引失效及查询错误

    两表关联时,因关联字段类型不一致导致的问题. 问题1. 索引失效. 问题2. 查询错误. 关联查询时int 类型的1与varchar类型的'001' 可匹配. 解决问题:利用cast(字段 as 字段 ...

  2. or导致索引失效的解决方法_SQL优化之索引失效

    尽量全值匹配 建表语句: CREATE TABLE `t_logs` ( `id` int(10) NOT NULL AUTO_INCREMENT, `action` varchar(100) DEF ...

  3. Oracle 删除分区 导致索引失效

    创建分区时如果创建了全局索引,删除时必须更新索引. 多分区查询,全局索引效率高点,如果针对于某分区查询,local 索引 效率会好点. --删除一个分区 :         一:常规写法        ...

  4. group by多字段分组

    在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_SelectionSu ...

  5. 玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!

    sql语句group by使用详解 group by的基本语法 基本语法 什么是分组查询(一个字段) 多个字段的分组查询 1.两个字段的分组查询 2.三个字段及N个字段进行分组查询 having子句的 ...

  6. MySQL5.7用group by分组根据组中某个字段的最大值求取那条记录(注意是整条记录)

    首先注意,取每组最大的数据和取每组最大的一条记录是两个概念,前者很简单直接分组,max()即可.另外由于我的是5.7.24版本,5.7版本普遍存在一个问题,就是select的字段只能是group by ...

  7. MYSQL数据库(十)- 数据表的插入(insert)、删(delete)、改(update)、查(select)、group by 分组、having语句设置分组条件,order by查询结果排序,

    目录结构 本章目录 一.插入insert: 方法一:insert标准插入数据写法 方法二:set插入数据写法 方法三:请看本章最后一个案例 二.插入update: 方法一:单表更新记录 方法二:多表更 ...

  8. mysql单列去重复group by分组取每组前几条记录加order by排序

    <div class="post"><h1 class="postTitle"><a id="cb_post_title ...

  9. group by 分组函数 的用法

    GROUP BY 是对结果集 进行分组 然后对每一组 ,可以对每一组进行统计 例如对每一组的某个字段进行统计 例如求和sum(column) 举个例子,我查询某个用户的某个时间段 的信息 1.没用到g ...

  10. mysql group by 聚合_浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    1. 聚合函数(Aggregate Function) MySQL(5.7 ) 官方文档中给出的聚合函数列表(图片)如下: 除非另有说明,否则聚合函数都会忽略空值(NULL values). 2. 聚 ...

最新文章

  1. Quartz.Net cron表达式详解
  2. DeepMind新语言模型SUNDAE:教自动编码器学会「自我纠正」,WMT14英德互译任务获SOTA...
  3. ajax与HTML5 history pushState/replaceState实例
  4. c语言中预处理指令的作用,C语言中常用预处理指令
  5. 逆向工程核心原理学习笔记(四):检索API方法2-设置断点
  6. Nginx使用之location和rewrite用法
  7. java的安装和配置
  8. javax maven项目缺少_maven冲突解决流程
  9. tablesorter,jquery
  10. [json]Json 入门
  11. sql CAST用法
  12. 英语学习/词典app行业top5简要分析
  13. 聊聊 Redis 是如何进行请求处理
  14. 2021李林精讲精练880题 【数学二 解析分册】
  15. 基于android的共享车位app
  16. 搭NAS or 租OSS
  17. Sobel,拉普拉斯算子
  18. [ACNOI2022]Bitset Dog
  19. [ATPG]解读report_nonscan_cells -summary得到的report
  20. js循环绑定事件问题及解决方法

热门文章

  1. 手把手教你运用深度学习构建视频人脸识别模型(Python实现)
  2. 如何高效高质进行Android技术开发
  3. Android FrameWork浅识
  4. layui表格边框_layui怎么固定表格的表头
  5. 中心极限与大数定理律的关系_中心极限定理的最最通俗解释
  6. java常量表达式区别_java编译器对string常量表达式的处理和优化
  7. vs2015 ef 连接mysql_VS2015 + EF6连接MYSQL
  8. python中数据处理的格式,json.csv txt excel
  9. 【没人看系列】js 数据类型
  10. 查找项目里面资源文件报空指针的解决办法