如何从Mysql 快速查⼀条数据
telnet命令加端口前⾔可能许多⼩伙伴在⾯试中会遇到这么样的⼀道⾯试题:如何以最⾼效率随机在 Mysql 数据表中查⼀条数据
实际上,这个题包含了两个点在 数据表随机查⼀条数据保证效率最⾼
实战
我们平时常⽤的英语App,⼤部分都有 随机显⽰⼀个单词或者多个单词的功能,为了便于理解,我设计了以下代码,并往表⾥加了 30000⾏数据。⽅法⼀
随机查,你可能会想到最原始最直观的⽅法,使⽤ Mysql 的 rand() ⽅法使⽤ explain 查看执⾏计划,可以发现使⽤ rand() ,Extra字段显⽰
Using temporary ,表⽰的是需要使⽤临时表;Using filesort ,表⽰的是需要执⾏排序操作。因此这个 Extra 的意思就是,需要临时表,并且需要在临时表上排序。
mysql面试题sql
我们的 Mysql 使⽤ InnoDB 存储引擎,对于 InnoDB 的数据表来说,执⾏全字段排序会减少磁盘访问,因此会被优先选择。但是,对于内存表,回表过程只是简单地根据数据⾏的位置,直接访问内存得到数据,根本不会导致多访问磁盘。优化器没有了这⼀层顾虑,那么它会优先考虑的,就是⽤于排序的⾏越少越好了,所以,MySQL这时就会选择 rowid 排序,排序临时表。也就是说,order by rand() 使⽤了内存临时表,内存临时表排序的时候使⽤了 rowid 排序⽅法(Using temporary 和 Using filesort ),查询的执⾏代价往往是⽐较⼤的。所以,在设计的时候,我们需要尽量避开这种写法。
⽅法⼆mongodb模糊查询命令
思路⼤概如下:CREATE TABLE `words ` ( `id ` int (11) NOT NULL AUTO_INCREMENT , `word ` varchar (64) DEFAULT NULL , PRIMARY KEY (`id `)) ENGINE =InnoDB ;delimiter ;;create procedure idata ()begin declare i int ; set i =0; while i <30000 do insert into words (word ) values (concat (char (97+(i div 1000)), char (97+(i % 1000 div 100)), char (97+(i % 100 div 10)), char (97+(i % 10)))); set i =i +1; end while ;end ;;delimiter ;call idata ();
1
2
3
4
笔记本电脑idea的快捷键5
6
7
8
9
10
11
12
13
14
15
16
17
jqueryremove节点之后再添加事件不生效18
19select * from words order by rand () limit 1;
1
取得这个表的主键 id 的最⼤值 M 和最⼩值 N ;⾸先查询出数据表的所有记录数⽤随机函数⽣成⼀个最⼤值到最⼩值之间的数 X = (M-N)*rand() + N ;取不⼩于X的第⼀个 ID 的⾏。然后在 [0, num_rows] 范围中随机
⽅法三那有没有可能,⼀句 sql 就完成 ⽅法⼆ 的查询,那当然是有的,SQL 如下:当然,上述的 sql 有⼀个问题,如果要快速随机查询多条数据,修改上述的语句 limit n,n 代表 n 条数据如修改成 li
mit 5,那么就会产⽣连续的 5 条记录。解决办法只能是每次查询⼀条,查询 5。次。当然,上述的问题可以使⽤以下⽅法解决。
参考博客:select count (*) as num_rows from words ;
1select * from words limit [0, num_rows 随机⼀个数X ], 1;
1SELECT * FROM `words ` AS t1 JOIN (SELECT ROUND (RAND () * ((SELECT MAX (id ) FROM `words `)-(SELECT MIN (id ) FROM `words `))+(SELECT MIN (id )WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;
12
3
4SELECT * FROM `words ` WHERE id >= (SELECT floor ( RAND () * ((SELECT MAX (id ) FROM `words `)-(SELECT MIN (id ) FROM `words `)) + (SELECT MIN (id ) FROM `words ORDER BY id LIMIT 5;
通配符公司1
2
3
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论