MYSQL创建100万条数据与count(1)、count(*)、count(column)区别

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: MYSQL创建100万条数据与count(1)、count(*)、count(column)区别.md

MySQL简单三步模拟创建百万数据

简单三部创建模拟数据

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

1、创建测试数据库sql

CREATE TABLE `app_user` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) DEFAULT'' COMMENT'用户昵称',
    `email` VARCHAR(50) NOT NULL COMMENT'用户邮箱',
    `phone` VARCHAR(20) DEFAULT'' COMMENT'手机号',
    `gender` TINYINT(4) UNSIGNED DEFAULT '0'COMMENT '性别(0:男;1:女)',
    `password` VARCHAR(100) NOT NULL COMMENT '密码',
    `age` TINYINT(4) DEFAULT'0'  COMMENT '年龄',
    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT = 'app用户表'

2、navicat 创建插入函数

-- 写函数之前必须要写,标志
DELIMITER $$
CREATE FUNCTION `mock_data` ()
    RETURNS INT
BEGIN
    DECLARE num INT DEFAULT 1000000;
    DECLARE i INT DEFAULT 0;
    WHILE i<num DO
INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`) VALUES ( CONCAT('用户',i), '12345678@qq.com', CONCAT('18',FLOOR(RAND()*((999999999-100000000)+100000000))), 0,UUID(), FLOOR(RAND()*100) );
        SET i=i+1;
    END WHILE;
    RETURN i;
END;
注意出现异常不允许创建函数执行
set global log_bin_trust_function_creators=TRUE;

3、执行函数

SELECT mock_data() -- 执行此函数 生成一百万条数据

count(*)、count(1)和count(column)区别以及执行效率高低比较

【mysql】count(*)、count(1)和count(column)区别

小结:
  count(*) 对行的数目进行计算,包含NULL。
  count(column) 对特定的列的值具有的行数进行计算,不包含NULL值。
  count(1) 这个用法和count(*)的结果是一样的。

性能问题:
  1、任何情况下 SELECT COUNT(*) FROM tablename 是最优选择;
  2、尽量减少 SELECT COUNT(*) FROM tablename WHERE COL = 'value' 这种查询;
  3、杜绝 SELECT COUNT(COL) FROM tablename WHERE COL2 = 'value' 的出现。

如果表没有主键,那么 count(1)count(*)快。

如果有主键,那么count(主键,联合主键)count(*)快。

如果表只有一个字段,count(*)最快。

count(1)count(主键)一样,只扫描主键。

count(*)count(非主键)一样,扫描整个表。


count(*)、count(1)、count(column)执行效率高低比较

count(column) 会忽略为 null 的列,其他两个不会。

执行效率:

    它们三个的效率如何呢?网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。而我在《高性能MySQL》一书中看到这样一段话: 当我们使用 count(*) 时,通配符 * 并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。我们发现最常见的错误就是,在括号内指定一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*),这样写意义清晰,性能也会很好。

测试:
  我用100万数据进行测试,发现当且仅当三者有主键时,他们的执行时间几乎相等

# 有主键:0.139s,无主键:0.283s
select count(*) from shop_order

# 有主键:0.154s,无主键:0.474s
select count(id) from shop_order

# 有主键:0.139s,无主键:0.285s
select count(1) from shop_order

# 有主键但不使用主键:0.383s (count(普通列))
select count(old_id) from shop_order

用75570717条数据进行测试,分别执行两次,测试结果如下:

# 第一次:50.660s  第二次:45.891s
select count(*) from tb_mattress_sleep_raw_data

# 第一次:59.925s  第二次:46.948s
select count(`mattress_id`) from tb_mattress_sleep_raw_data

# 第一次:90.997s  第二次:70.314s
select count(`time_zone`) from tb_mattress_sleep_raw_data

另外,在 MyISAM 中,count() 函数总是非常快的,不过这也是有前提条件的,即只有没有任何 where 条件的 count(*)才非常快,这是这个引擎的特性。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
8月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
6月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
377 0
|
5月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
497 10
|
6月前
|
SQL 存储 缓存
MySQL 如何高效可靠处理持久化数据
本文详细解析了 MySQL 的 SQL 执行流程、crash-safe 机制及性能优化策略。内容涵盖连接器、分析器、优化器、执行器与存储引擎的工作原理,深入探讨 redolog 与 binlog 的两阶段提交机制,并分析日志策略、组提交、脏页刷盘等关键性能优化手段,帮助提升数据库稳定性与执行效率。
185 0
|
4月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
424 158
|
4月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
4月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
942 152
|
4月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
785 156
|
4月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
394 156
|
4月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
492 161