首页 > 数据库 > MySQL > 正文

mysql多表,随机查询优化方案

2019-11-02 14:26:54
字体:
来源:转载
供稿:网友

  我以前介绍过最多的就是单表随机查询时的优化了,今天 看到一站长分享了一个多表随机查询优化的一些方法与方案,下面我们就一起来看看吧.

  本文主要谈论如何实现Mysql的随机查询,多表随机查询。在Mysql中随机取出一条记录的实现方法。

  我们通常的查询是没有where或者where fields>2这样的方式,这样只能取出在某种条件下的一条或多条,如果条件不变(例如2),那么结果就一直不会有变化。

  那么如何实现随机查询呢?本人有两种方法。

  方法一、数据表记录不大的情况下:

  select * from `table`

  查出来所有的记录列表,然后array_rand()随机出一个结果的数组的key。连续的key可以使用mt_rand(1, count($list)); 为什么不使用rand而是mt_rand呢?因为mt_rand币rand快4倍。

  这种情况下,查出整个列表,存入到Memcache的缓存或者Redis的NoSQL中,下次直接取出结果集而不需要查表。不过当数据量一旦超过万级别,取出列表就很困难了。

  方法二:使用SQL语句随机

  MYSQL函数RAND(),产生一个0-1之间的小数,然后MAX(`id`)可以获得该表中最大的ID。那么MAX(`id`) * RAND()就可以取到表中所有的ID。OK,看语句。

  SELECT * FROM `table` WHERE `id` > (SELECT RAND() * (SELECT MAX(`id`) FROM `table`) LIMIT 0, 1

  既然MAX(`id`) * MAX(`id`)可以取到表里所有值,那么本语句的WHERE就可以取到本表的所有情况,那么这就是一个所有记录都有可能被取到的随机SQL语句。

  补充另一篇文章

  1. 多表连接类型

  1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用',' 如:

  SELECT * FROM table1 CROSS JOIN table2

  SELECT * FROM table1 JOIN table2

  SELECT * FROM table1,table2

  由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢。一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN

  2. 内连接INNER JOIN 在MySQL中把INNER JOIN叫做等值连接,即需要指定等值连接条件在MySQL中CROSS和INNER JOIN被划分在一起。 join_table: table_reference [INNER | CROSS] JOIN table_f

西瓜电影网[www.aikan.tv/special/xiguadianyingwang/]
actor [join_condition]

  3. MySQL中的外连接,分为左外连接和右连接,即除了返回符合连接条件的结果之外,还要返回左表(左连接)或者右表(右连接)中不符合连接条件的结果,相对应的使用NULL对应。

  例子:

  user表:

  id | name

  ———

  1 | libk

  2 | zyfon

  3 | daodao

  user_action表:

  user_id | action

  —————

  1 | jump

  1 | kick

  1 | jump

  2 | run

  4 | swim

  sql:

  select id, name, action from user as u

  left join user_action a on u.id = a.user_id

  result:

  id | name | action

  ——————————–

  1 | libk | jump ①

  1 | libk | kick ②

  1 | libk | jump ③

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表