在MySQL 5.7 COUNT()会选择聚集索引,进行一次内部handler函数调用,即可快速获得该表总数
执行计划显示:Extra:Select tables optimized away
5.7以前的版本中,COUNT()请求通常是:扫描普通索引来获得这个总数。
执行计划显示: Extra:Using index
如果聚集索引较大(或者说表数据量较大),没有完全加载到buffer pool中的话,MySQL 5.7的查询方式有可能反而会更慢,还不如用原先的方式(MySQL 5.6)
解决办法:强制走普通索引,不过还需要加上WHERE条件,否则还是不行
select count() from stock force index(idx_stock) where id >0; |
文章作者: Leon
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Leon!
相关推荐
2022-11-03
Mysql 存储 Emoji 坑
Mysql 存储 Emoji 坑在现代的应用程序中,Emoji表情符号已经成为用户之间交流的重要组成部分。然而,在将Emoji存储到MySQL数据库时,你可能会遇到一些问题。本文将介绍这些问题以及相应的解决方案。 问题描述当我们尝试将包含Emoji的文本插入到MySQL数据库中时,可能会遇到以下问题: 存储问题:MySQL默认使用UTF-8字符集,但并不是所有的UTF-8编码都能正确地存储和处理Emoji字符。有些Emoji字符可能无法存储,或者在存储和检索过程中出现乱码或截断。 索引和排序问题:在进行索引和排序操作时,MySQL可能无法正确处理包含Emoji的字段。这可能导致排序结果不正确或无法正常使用索引。 解决方案针对上述问题,我们可以采取以下解决方案: 选择合适的字符集和编码:为了正确地存储和处理Emoji字符,我们可以将MySQL的字符集和编码配置为utf8mb4。utf8mb4字符集支持四字节的UTF-8编码,可以存储包含Emoji的字符。 调整字段的长度:Emoji字符可能占用多个字节,因此在定义存储Emoji的字段时,确保字段长度足够容纳Emoji字符的...
2017-01-11
使用MySQL命令行导出和导入数据
使用MySQL命令行导出和导入数据MySQL是一个流行的关系型数据库管理系统,提供了许多方法来导出和导入数据。在本篇博客中,我们将介绍如何使用MySQL命令行工具来导出和导入数据。 导出数据使用MySQL命令行工具可以轻松地将数据导出到文件中。以下是导出数据的步骤: 打开命令行终端,并使用以下命令连接到MySQL数据库: mysql -u username -p 将username替换为你的MySQL用户名。系统将提示你输入密码。 连接到要导出数据的数据库: USE database_name; 将database_name替换为你的数据库名称。 运行以下命令导出数据到文件: SELECT * INTO OUTFILE '/path/to/output/file.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'FROM table_name; 将/path/to/...
2024-02-01
Mysql查询如何区分大小写
这篇文章主要介绍mysql查询如何区分大小写,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! mysql查询如何区分大小写在mysql中,可以利用select查询语句配合binary关键字来区分大小写,select语句用于查询数据,binary关键字用于区分大小写,语法为 select * from 表名 WHERE binary 字段=字段值 mysql查询如何区分大小写mysql中查询默认是区分大小写的,但是在mysql中默认不区分大小写。 解决办法:mysql可以在SQL语句中加入 binary来区分大小写。BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写。 一、查询语句上加binaryselect * from users WHERE binary user_name = '小王' AND status != 0 二、建表时加binarycode varchar(10) binary 执行完上面的sql后,对该表的查询就能区分大小写了。

2021-09-25
MySQL 优化器参数derived_merge导致多表关联SQL性能及其低下
最近,MySQL维护中,遇到一个问题,通条SQL语句,在mysql 5.6的测试环境中执行速度不到1秒,但是在 mysql 5.7生产环境中执行却要近5分钟,mysql 5.7中同样的数据库同样的数据量,更新完表的统计信息后执行 速度还是要2分钟。本次问题的处理与sql语句本身没有关系,只跟mysql数据库自身的优化器参数相关,下面是 问题的分析排查过程,问题分析中的sql语句不需要显示,可以明确sql是多表join连接并且业务不允许更改。 1、首先,查看测试环境和生产环境中,mysql的sql语句的执行计划--测试环境,执行计划只需显示局部能说明问题即可 --生产环境,执行计划只需显示局部能说明问题即可 2、从测试与生产环境sql语句的对比可以明显发现,sql的执行计划不一致,后续排查中发现a、测试环境中sql涉及的表和索引的统计信息都是当天最新的,而生产环境中的相关表和索引的统计信息比较陈旧b、测试环境 mysql大版本为5.6,生产环境mysql大版本为5.7 3、问题处理a、由于sql执行计划不一致,且生产环境统计信息比较旧,重新收集生产环境表的统计信息,收集后s...
2023-10-05
Mysql - InnoDB自增列重复值问题 (Mysql 5.7以下)
MySQL - InnoDB自增列重复值问题 (Mysql 5.7以下) 问题重现先从问题入手,重现下这个 bug MySQL> use test;MySQL> drop table if exists t1;MySQL> create table t1(id int auto_increment, a int, primary key (id)) engine=innodb;MySQL> insert into t1 values (1,2);MySQL> insert into t1 values (null,2);MySQL> insert into t1 values (null,2);MySQL> select * from t1;+----+------+| id | a |+----+------+| 1 | 2 || 2 | 2 || 3 | 2 |+----+------+MySQL> delete from t1 where id=2;MySQL> delete from ...
2023-10-05
使用MySQL计算回撤率的简单方法
介绍:回撤率是衡量投资组合或交易策略风险的重要指标。在本篇博客中,我们将演示如何使用MySQL来计算交易回撤率。我们将建立一个交易记录表,并使用MySQL查询来计算资金曲线和回撤率。 步骤:创建交易记录表:我们首先需要创建一个包含交易记录的表。使用MySQL的CREATE TABLE语句创建一个名为”trades”的表。该表将包含交易日期、交易金额和盈亏标志等字段。 CREATE TABLE trades ( trade_date DATE, amount DECIMAL(10, 2), is_profit BOOLEAN); 插入交易记录:在”trades”表中插入实际的交易记录。每条记录应包含交易日期、交易金额和盈亏标志。这些记录将用于计算资金曲线和回撤率。 INSERT INTO trades (trade_date, amount, is_profit)VALUES ('2021-01-01', 100.00, TRUE), ('2021-01-02', -50.00, FALSE), ('2021-01...
评论
公告
记录技术实践,分享学习与思考。



