首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

使用Django数据库中随机N条记录的不同方法及其性能实测

举个栗子,这里是MYSQL是如何处理这个查询的(其他数据库的情况也差不多),想象一下当一个表有十亿行的时候会怎样: 为了完成ORDER BY RAND() ,需要一个RAND()列来排序 为了有RAND...为了这个新表,mysql建立了一个带有新列的,新的临时表,并且将已有的一百万行数据复制进去。 当其新建完了,他如你所要求的,为每一行运行RAND()函数来填上这个值。...是的,你派mysql创建一百万个随机数,这要点时间:) 几个小时或几天后,当他干完这活,他要排序。是的,你排mysql去排序一个一百万行的,最糟糕的表(说他最糟糕是因为排序的键是随机的)。...project中新建一个app,数据库是MYSQL: D:\PyWorkspace\DjangoTest>python manage.py startapp randomrecords 在models.py...附上三种方法数据量和SQL时间/总时间的数据图表: 最后总结,Django下,使用mysql数据库,数据量在百万级以下时,使用 Python Record.objects.order_by('?')

7K31

MySQL随机函数RAND

100 div 10)), char(97+(i % 10)))); set i=i+1; end while; end;; delimiter ; call idata(); 如何随机...上述默认使用的临时表是内存表,对于内存表来说,回表过程只是简单地根据数据行的位置直接访问内存得到数据,并不会导致额外的磁盘访问,因此MySQL会在排序时会优先使用rowid排序。...上述SQL语句的执行过程如下: 创建一个临时表(该表使用的是memory引擎),表里有两个字段,第一个字段是double类型(记为字段R),第二个字段是varchar(64)类型(记为字段W),临时表没有索引...word表中,按照主键顺序取出所有的word值,对于每一个word值,调用rand函数生成一个大于0小于1的随机小数,把该随机小数和word值存入临时表的R和W字段中,至此扫描行数是10000 临时表目前有...10000行数据,下面需要对这个临时表按照字段R进行排序 初始化sort_buffer,sort_buffer中有两个字段,一个是double类型,另一个是整型 内存临时表中逐行取出R值和位置信息,分别存入

2.5K10

MySQL深入学习第十七篇-如何正确地显示随机消息?

我强调了“InnoDB 表”,你肯定想到了,对于内存表,回表过程只是简单地根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘。...这个临时表使用的是 memory 引擎,表里有两个字段,第一个字段是 double 类型,为了后面描述方便,记为字段 R,第二个字段是 varchar(64) 类型,记为字段 W。...在上一篇文章中,我们对 InnoDB 表排序的时候,明明用的还是 ID 字段。 这时候,我们就要回到一个基本概念:MySQL 的表是用什么方法来定位“一行数据”的。...然后,依次把它们的 rowid 取出来,去临时表里面拿到 word 字段,这个过程就跟上一篇文章的 rowid 排序的过程一样了。...现在,我们再看看,如果我们按照随机算法 2 的思路,要随机 3 个 word 值呢?你可以这么做: 1. 取得整个表的行数,记为 C; 2. 根据相同的随机方法得到 Y1、Y2、Y3; 3.

54910

MySQL实战第十七讲-如何正确地显示随机消息?

我强调了“InnoDB 表”,你肯定想到了,对于内存表,回表过程只是简单地根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘。...这个临时表使用的是 memory 引擎,表里有两个字段,第一个字段是 double 类型,为了后面描述方便,记为字段 R,第二个字段是 varchar(64) 类型,记为字段 W。...在上一篇文章中,我们对 InnoDB 表排序的时候,明明用的还是 ID 字段。 这时候,我们就要回到一个基本概念:MySQL 的表是用什么方法来定位“一行数据”的。...然后,依次把它们的 rowid 取出来,去临时表里面拿到 word 字段,这个过程就跟上一篇文章的 rowid 排序的过程一样了。...现在,我们再看看,如果我们按照随机算法 2 的思路,要随机 3 个 word 值呢?你可以这么做: 1. 取得整个表的行数,记为 C; 2. 根据相同的随机方法得到 Y1、Y2、Y3; 3.

44620

2021-01-19:mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型...

2021-01-19:mysql中,一张表里有3亿数据,未分表,其中一个字段是企业类型,企业类型是一般企业和个体户,个体户的数据量差不多占50%,根据条件把个体户的行都删掉。请问如何操作?...网上答案:1: MYSQL数据库因生产原因需要删除大量数据,因数据量太大接近上亿条,用常规delete删除小数据可以,删除几千万大数据量会非常慢,并且不会释放出磁盘空间,还需要optimize或repair...由于 MySQL 是按页加载数据,这些存储碎片不仅大量增加了随机读取的次数,并且让页命中率降低,导致页交换增多。 4.由于产生了大量日志,我们可以看到这张表的占用空间大大增高。...网上答案3: 删除达标上的多行数据时,innodb会超出lock table size的限制,最小化的减少锁表的时间的方案是: 1选择不需要删除的数据,并把它们存在一张相同结构的空表里 。...*** mysql数据库上亿级大数据如何快速删除 每日一面 - mysql 大表批量删除大量数据 mysql删除超大数据 Mysql删除大量数据几种方案 MySQL删除大量数据几种方案(续) 评论

1.1K10

Mysql如何随机获取表中的数呢rand()

但是对于内存表,回表过程只是简单的根据数据行的位置,直接访问内存得到数据,根本不会导致多访问磁盘,因此优化器如果没有这个顾虑,那么他优先考虑的是排序的行越少越好了,所以,Mysql这个时候就会选择rowid...我们在来看看上面随机获取字段的sql语句是如何执行的 创建一个临时表,临时表使用的是memory引擎,表里面有两个字段,一个字段double类型,我们叫R,另一个字段varchar(64),记为W,且没有建立索引...现在临时表有10000行数据了,接下来你要在这个没有索引的内存临时表上,按照R字段排序 初始化sort_buffer中两个字段,一个是double,一个整形 内存临时表中一行一行的获取R和位置信息,把字段放入到...floor函数在这里的作用,就是整数部分 获取 limit Y ,1,得到一行数据 对应的sql如下 mysql> select count(*) into @C from t; set @Y =...现在如果要获取三个随机数,根据随机算法2的思路 获取整张表的总行数C 根据同样的共识获取Y1,Y2,Y3 再执行limit Y,1.获取三个随机数 对应的sql语句如下 mysql> select

4.5K20

My SQL常用操作汇总

); 查询表中的数据 select * from 表的名字; 根据范围查询表里数据 select * from table limit m,n; - 显示范围是:[m+1行,m+n行]...,包括m+1和m+n行 根据字段查询表里数据 select 字段名字1,字段名字2 from 表的名字; 给表里查询出来的数据字段别名 select 字段名字1 as 要的别名...,字段名字2 as 要的别名 from 表的名字; 根据字段查询表里数据(去重) select distinct 字段名字 from 表的名字; 根据条件查询表里数据(条件可使用not...select * from 表的名字 where 条件; 模糊查询表里数据根据条件查询的条件中使用like和通配符%(任意字符),_(一个字符) 查询表里的某字段为NULL的值条件必须用is...null,不能用= null 对表里数据排序(先按字段1排,有相同的则再按字段2排) select * from 表的名字 order by 字段名字1 asc(默认升序)/desc(降序)

91840

DML和DQL

9.查询语法 查询产生一个虚拟表 看到的是表形式显示的结果,但结果并不真正存储 每次执行查询只是数据表中提取数据,并按照表的形式显示出来 语法: SELECT FROM...) 字符串替换 SELECT INSERT(     '这是SQL Server数据库',     3,10,'MySQL'); 返回:这是MySQL数据库 LOWER(str) 将字符串转为小写 SELECT...0条记录开始默认是0 :正常写法:limit 0,4*/ /*每页4条,显示第2页,即从第5条记录开始显示4条数据(5-8)*/ /*第一个参数是第几开始,第二个参数是多少条(行)数据*/ select...studentNo和name字段*/ alter table `student` drop `studentNo`,drop `name`; /*修改表里的studentNo字段为id*/ alter...0条记录开始默认是0 :正常写法:limit 0,4*/ /*每页4条,显示第2页,即从第5条记录开始显示4条数据(5-8)*/ /*第一个参数是第几开始,第二个参数是多少条(行)数据*/ select

88410

MySQL - Join关联查询优化 --- NLJ及BNL 算法初探

(称为驱动表)中读取行,在这行数据中取到关联字段根据关联字段在另一张表(被驱动表)里取出满足条件的行,然后取出两张表的结果合集。...> 执行过程如下 先从t2 驱动表里 取出一条记录(如果有where条件,则按where条件过滤后的结果集中取出一行 ) 拿到t2 结果集中的一条记录中的关联字段 a , 去t1表中查找 取出 t1...中满足条件的行,跟 t2 中获取到的结果合并,作为结果返回给客户端 重复上述步骤 我们来算一下这个操作MySQL要读取多少行数据 首先读取 t2 表的所有数据 100条记录 ,然后遍历这每行数据字段...举个例子 比如 t2 表有1000行记录, join_buffer 一次只能放800行数据,那么执行过程就是先往 join_buffer 里放800行记录,然后 t1 表里数据跟 join_buffer...中数据对比得到部分结果,然后清空 join_buffer ,再放入 t2 表剩余200行记录,再次 t1 表里数据跟 join_buffer 中数据对比。

1.4K20

MySQL系列 | MySQL数据库设计规范

因为如果设为主键且主键值为随机插入,则会导致innodb内部page分裂和大量随机I/O,性能下降。...【建议】表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值。因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题。...【建议】建议对表里的blob、text等大字段,垂直拆分到其他表里,仅在需要读这些对象的时候才去select。 【建议】反范式设计:把经常需要join查询的字段,在其他表里冗余一份。...【建议】建表或加索引时,保证表里互相不存在冗余索引。对于MySQL来说,如果表里已经存在key(a,b),则key(a)为冗余索引,需要删除。...因为select *会将不该读的数据MySQL里读出来,造成网卡压力。且表字段一旦更新,但model层没有来得及更新的话,系统会报错。

3.2K30

MySQL数据库设计规范

因为如果设为主键且主键值为随机插入,则会导致innodb内部page分裂和大量随机I/O,性能下降。...【建议】表中所有字段必须都是NOT NULL属性,业务可以根据需要定义DEFAULT值。因为使用NULL值会存在每一行都会占用额外存储空间、数据迁移容易出错、聚合函数计算结果偏差等问题。...【建议】建议对表里的blob、text等大字段,垂直拆分到其他表里,仅在需要读这些对象的时候才去select。 【建议】反范式设计:把经常需要join查询的字段,在其他表里冗余一份。...【建议】建表或加索引时,保证表里互相不存在冗余索引。对于MySQL来说,如果表里已经存在key(a,b),则key(a)为冗余索引,需要删除。...因为select *会将不该读的数据MySQL里读出来,造成网卡压力。且表字段一旦更新,但model层没有来得及更新的话,系统会报错。

2.2K40

MySQL分库分表的一些理解

MySQL原生的分区表本身是为分库分表设计的,分区表的概念如下: 分区表本身是一个独立的逻辑表,它的特点是所有的数据还在一张表中,但是物理存储根据一定的规则放在不同的文件中。...对于应用来说,它感知不到分区表的存在,MySQL在创建分区表的时候使用partition by子句定义每个分区存放的数据,在执行查询的时候,优化器会根据分区定义将原本需要遍历全表的过程转化为只需要遍历表里某一个或者某一些分区的工作...,放在user_info的person表里面,用户的登录信息,放在user_info的login表里面... 3、数据库实例层面,如果一个服务器上有多个MySQL实例,分摊压力的角度,可以将多个数据库分别放置在不同的实例上...5、字段层面,这个不是很常用,就是把表里面的字段单独的拆分出来作为一个表,这一般用于前期设计失误的情况下。...例如一些log库,我们可以按照一定的基数去拆,比如logid对100模,然后将结果均匀的分配在100张表里面。

56330

MySQL parttion分区,以及分区和分表的区别

在日常的工作中,我们经常遇到一张表里面保存了上亿甚至过十亿的记录(在MYsql字段数较多最多 1000万数据字段少的话就最多2000万,超过这个量MYs性能会相对来说下降很多)。...一 什么是mysql分表,分区 什么是分表,表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 二 mysql分表和分区有什么区别呢 1,实现方式上 a),mysql的分表是真正的分表...他们二个都是独立的表,数据的时候,我们可以通过总表来。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据数据都放在分表里面。...数据处理上 a)分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。...并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。

1.4K20

Mysql实例 数据库优化--数据库表设计

SQL执行慢的原因: 网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等硬件问题 数据库整体结构已经扛不住压力 没有索引或者索引失效 数据表里数据记录过多 服务器调优及各个参数设置也可能会影响 开发者编写的...SQL效率 其它 根据上述问题,将数据库的优化分为几个阶段进行调整,力求让数据库发挥好的性能和稳定运行。...二.数据库表设计 项目立项后,开发部门根据产品部门需求开发项目。开发工程师在开发项目初期会对表结构设计。对于数据库来说,表结构设计很重要,如果设计不当,会直接影响到用户访问网站速度,用户体验不好!...5.千万不要使用 ORDER BY RAND() 如果想随机数据,不要用用随机,因为这种查询,对数据库的性能毫无益处(消耗CPU)。...15.避免发生隐式类型转换 类型转换主要是指在WHERE子句中出现字段的类型和传入的参数类型不一致的时候发生的类型转换;这是因为如果传入的数据类型和字段类型不一致,MySQL可能会对数据进行类型转换操作

2.3K10

数据库进阶4 Mysql 性能优化20个原则(2)

想打乱返回的数据行?随机挑一个数据?真不知道谁发明了这种用法,但很多新手很喜欢这样用。但你确不了解这样做有多么可怕的性能问题。 6....就算是你用了Limit 1也无济于事(因为要排序) 下面的示例是随机挑一条记录 数据库里读出越多的数据,那么查询就会变得越慢。...避免 SELECT * 所以,你应该养成一个需要什么就什么的好的习惯。... PROCEDURE ANALYSE() 取得建议 PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议。...一定要注意,这些只是建议,只有当你的表里数据越来越多时,这些建议才会变得准确。一定要记住,你才是最终做决定的人。 11.

43320

一条查询SQL在MySQL中是怎么执行的

做完了这些识别之后,就会做”语法分析“,根据词法分析的结果,语法分析会根据语法规则,判断输入的SQL语句是否满足MySQL的语法要求。...如下的语句: mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20; 既可以先从t1表里取出c=10的记录的ID值,再根据...ID值关联到表t2,再判断t2表里的值是否等于20 也可以先从t2表里取出d = 20的记录ID值,再根据ID关联到t1表,再判断t1表里面c1 的值是否等于10 这两个执行的逻辑结果是一样的,但是执行效率是不同的...如我们这个例子的表T中,ID字段没有添加索引,那么执行流程如下: 调用InnoDB引擎接口这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这一行放入结果集中。...在数据库的慢查询日志中可以看到一个rows_examined的字段,表示这个语句执行过程中扫描了多少行,这个值是在执行器每次调用引擎的时候累加的,有时候执行器调用一次,在引擎内部扫描了多行,隐藏引擎扫描行数跟

4.8K20

03.SQLServer性能优化之---存储优化系列

RCreateTime 就可以知道我应该往哪个表里面写数据:==》Article2 同理,想查询某个时间的数据也是可以通过路由表知道该往哪个表里面查询...的数据时,哪个呢?)...这个过程可以通过应用程序去完成,毕竟可以根据路由表来统一汇总 排序就比较蛋疼了,如果是按时间(分表字段)的还好,因为我们路由表就是按时间分表的,相对简单。如果按照某个字段排序的话。。。。。...(⊙o⊙)…没办法就每个表里面的数据吧。...很多人总是疑惑为什么分页越往后面越慢(按时间不怕,我们就是按时间分表的,你去对应时间区里面就好了) 比如按字段1排序,每一页20条数据,要求取第一页的数据==》 ?

71750

MySql的基本操作以及以后开发经常使用的常用指令

第一章:数据类型和操作数据MySQL语句的规范 (1):关键字与函数名称全部大写 (2):数据库名称,表名称,字段名称全部小写 (3):SQL语句必须以分号结尾 1:命令行模式启动mysql服务...48:(分组使用 group by 根据分组的字段     WHERE子句里面不能写具体函数,写了就报错,我在这里已经重新创建新的数据表,请自行脑补) ? ?...也可以查询详细字段,将详细字段替换掉*即可。不过这样写有缺陷,不知道查询的是那个表里面的。 ? ?...(唯一索引,起别名,在index后面加上自己的别名即可。) ?...76:视图的引入 1:视图是一种虚拟的表,是数据库中一个或者多个表中导出来的表 2:数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中 3:使用视图查询数据时,数据库系统会原来的表中取出对应的数据

2K100
领券