`

MySql 语句使用收集

阅读更多

MySql update 表间更新数据

有两个表,结构如下:

a(id,sex,email,public)

b(id,depart,salary)

由于需求改变,要为 b 也增加一个 public 字段,并且和 a 表中 id 相同的记录中的 public 的值相同。

加一个字段比较容易,直接 alter就行了,但是表间更新数据以前没做过,就google 之,结果发现很多人都是这么写的:

UPDATE b SET public=a.public FROM a WHERE b.id=a.id

但是在Mysql 下面死活不好使,总是提示有错误,后来查了一下资料,发现 mysql 不支持 update 里面有 from 子句,网上很多人写的可能都是针对 sqlserver 或其他数据库的。改写SQL 如下:

UPDATE b,a SET b.public=a.public WHERE b.id=a.id

MySql 随机取N条数据

需求:用SQL语句随机从数据库中随机取N条数据。

以前不太清楚SQL语句可以直接随机取数据,今天查了一下,发现有两个随机函数: newid() 和 rand() 刚才验证了一下,只有一个,是 rand(),newid() 是MsSql 里面的,更正。(我还是不严谨。。囧)

所以随机取数据就可以这么写:

1
SELECT FROM aaa ORDER BY rand() LIMIT N
关于效率问题请看以下内容::::

mysql使用rand随机查询记录效率测试

一直以为mysql随机查询几条数据,就用

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

就可以了。
但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上

查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。

You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.


搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

上面的语句采用的是JOIN,mysql的论坛上有人使用

SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;

我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。

于是我把语句改写了一下。

SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))) 
ORDER BY id LIMIT 1;

这下,效率又提高了,查询时间只有0.01秒

最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`))) 
ORDER BY id LIMIT 1;
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;

最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。

分享到:
评论

相关推荐

    MySQL SQL基础语句最佳实践

    MySQL是目前广泛使用的开源关系型数据库管理系统,其基础语句遵循结构化查询语言(SQL)标准,用于实现数据的存储、检索、更新和管理。SQL是一种功能强大且用途广泛的数据库编程语言,它由数据查询语言(DQL)、数据...

    Effective MySQL之SQL语句最优化(高清)

    《Effective MySQL之SQL语句最优化》提供了很多可以用于改进数据库和应用程序性能的最佳实践技巧,并对这些技巧做了详细的解释。... ●学习使用不为常人所知的一些性能技巧来改进索引效率并简化SQL语句。

    MySQL语句用法

    文档收集了MySQL的各种语法及示例说明,适合使用到MySQL的开发人员收录。

    Python-MysqlMonitor一款监控mysql执行语句的工具

    Python-MysqlMonitor是一款专为MySQL数据库设计的监控工具,它可以帮助用户实时跟踪和分析MySQL服务器上执行的SQL语句,从而优化数据库性能、定位问题和提升运维效率。这款工具主要面向数据库管理员和开发人员,通过...

    MySQL语句大全集锦+加详细解说经典珍藏.doc

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,用于存储...理解并熟练运用这些MySQL语句和管理技巧,可以帮助你更有效地管理和维护数据库系统。记住,数据库安全和权限控制是确保数据完整性和系统安全的关键因素。

    MYSQL安装问题&使用大收集

    这篇“MYSQL安装问题&使用大收集”博文中,博主可能详细记录了安装MySQL时遇到的问题及解决方案,以及MySQL的日常使用技巧。由于描述为空,我们只能依据标题和标签来推测可能涵盖的内容。 首先,关于MySQL的安装,...

    MySQL数据库后端语句执行监测工具

    MySQL的性能_schema模块为监控提供了丰富的数据,可以收集关于线程、内存、表锁等信息。通过查询performance_schema库中的表,可以获取到SQL语句的执行统计,包括执行次数、耗时等。 3. **EXPLAIN分析**: 使用...

    sql语句使用手册收集

    本手册聚焦于SQL语句的使用,旨在帮助用户更好地理解和运用SQL进行数据操作。 在"微软Sql_参考手册.chm"中,你将找到关于Microsoft SQL Server数据库管理系统中SQL语句的详尽信息。微软SQL Server是一个企业级的...

    两种语句 国家省份城市mysql.zip

    MySQL是一个广泛使用的开源关系型数据库管理系统,因其高效、稳定和易于管理而受到青睐。在这个“两种语句 国家省份城市mysql.zip”压缩包中,我们很显然拥有一份关于全球国家、省份、城市的数据库,这对于构建地理...

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ 5_存储过程函数流程控制语句讲解.mp4 │ ├─新版MySQL DBA综合实战班 第05天 │ 1_课后作业讲解.mp4 │ 2_MySQL游标讲解.mp4 │ 3_MySQL触发器.mp4 │ 4_MySQL触发器课堂强化练习.mp4 │ 5_MySQL数字和时间类型...

    jsp操作mysql简单实例

    在与MySQL数据库交互时,JSP通常会创建一个`java.sql.Connection`对象,通过`DriverManager.getConnection()`方法连接到数据库,然后使用`Statement`或`PreparedStatement`对象执行SQL语句。例如,创建用户时,可能...

    MYSQL查询语句的经典操作(图)[收集].pdf

    在示例中,我们看到如何使用`CREATE TABLE AS SELECT`语句来备份表。这允许你快速地创建一个与原表结构相同的新表,并填充相同的数据。 `ALTER TABLE`语句则用于修改表结构。例如,添加主键约束: ```sql ALTER ...

    mysql5.5.36及mysql-font安装包

    5. **Performance Schema**:这是一个用于收集和监控数据库性能的内置框架,帮助管理员优化数据库性能。 6. **更好的Unicode支持**:增强了对UTF-8字符集的处理,为多语言环境提供更好的支持。 `mysql-font`可能指...

    mysql操作常用问题解决

    以上就是关于"mysql操作常用问题解决"的一些关键知识点,涵盖了MySQL数据库的基础使用、管理、优化和故障排查等方面,对于日常操作和维护MySQL数据库非常有帮助。通过学习和实践这些内容,可以有效地提升MySQL数据库...

    mysql 8.0 ocp 题库

    9. **性能_schema和sys schema**:学习如何利用这两个内置的schema来收集和分析MySQL的性能数据。 10. **问题诊断与调试**:掌握如何使用错误日志、慢查询日志和性能仪表板来定位和解决性能问题。 在使用提供的OCP...

    mysql学习资料大全

    描述中提到,这些资料是为了一个项目而收集的,这意味着它们可能具有实践性和针对性。对于初学者来说,学习如何在实际项目中应用MySQL是非常重要的,因为这将帮助他们理解理论知识与实际操作之间的联系。同时,对于...

    利用Flume将MySQL表数据准实时抽取到HDFS、MySQL、Kafka

    Flume是Apache的一个分布式、可靠且可用于有效收集、聚合和移动大量日志数据的系统。在这个场景中,它被用来从MySQL数据库中抽取数据,并将这些数据流式传输到HDFS、MySQL以及Kafka。 1. **Flume**: Flume的核心...

    Mysql查询语句优化技巧

    这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整理的,主要是查询语句上面的优化,其它层面的优化技巧在此不做记录。 查询的开销指标: 执行时间 检查的行数 返回的行数 建立索引的几个准则: (1...

    最新mysql-connector-java-5.1.46(领附MySQL向Oracle迁移教程)

    在Java应用中,使用`mysql-connector-java`驱动主要是通过以下步骤: 1. **引入依赖**:首先,将`mysql-connector-java-5.1.46.jar`文件添加到项目的类路径中。如果是Maven项目,可以在`pom.xml`中添加对应的依赖:...

    sql精典语句收集

    "sql精典语句收集"这个主题涵盖了多种常用的、高效的操作数据库的命令,这些语句在MySQL这样的关系型数据库管理系统中尤为重要。MySQL是开源且广泛使用的SQL数据库,它支持各种类型的数据操作和管理任务。 首先,...

Global site tag (gtag.js) - Google Analytics