mysql 两表联查分页排序效率优化

数据库中有两张表

t1 存储消息信息

+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| code | int(10) unsigned | NO   | MUL | NULL    |                |
| detail    | varchar(200)     | NO   |     | NULL    |                |
| object    | varchar(50)      | NO   |     | NULL    |                |
| create_at | datetime         | NO   |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+

t2 存储消息类型

+--------------+---------------------+------+-----+---------+----------------+
| Field        | Type                | Null | Key | Default | Extra          |
+--------------+---------------------+------+-----+---------+----------------+
| code    | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| level        | tinyint(3) unsigned | NO   | MUL | NULL    |                |
| type         | varchar(30)         | NO   |     | NULL    |                |
| content      | varchar(50)         | NO   |     | NULL    |                |
| status       | tinyint(3) unsigned | NO   |     | NULL    |                |
+--------------+---------------------+------+-----+---------+----------------+

现在需要对这两张表进行分页排序联查。

t1 的记录数 230万条,t2表200条

写了三种查询语句如下:

1)最慢
select t1.*, t2.* from t1, t2 where t1.code = t2.code order by t1.create_at desc limit 1065701,20;
耗时:14.48秒

2)使用left join
SELECT t1.*,t2.level AS level, t2.content AS content FROM t1left join t2on t1.code=t2.code order by create_at desc limit 1065701,20;
耗时:9.71秒

3)先查缩小t1表中的范围,再和t2表进行联查
select t1.*, t2.level AS level, t2.content AS content FROM t1 left join t2 on t1.code=t2.code join (select a.id from t1 a join (SELECT id from t1 order by create_at desc limit 1065721,20) b where a.id = b.id) t where t.id=t1.id;
耗时:1.41秒

总结:

在多表联查分页排序,最大的瓶颈在排序,因此我们应该最大化的优化排序。鉴于此,我们先在t1表中分页排序查出符合条件的id,然后使用这个结果集去查t1、并与t2进行联查获取所有需要的信息。

不知道还有没有更好的优化方式,还请大牛指导:)

时间: 2024-08-07 02:27:03

mysql 两表联查分页排序效率优化的相关文章

row_number() over 两表连接分页SQL

--总条数 SELECT COUNT(1) FROM dbo.osaleh INNER JOIN dbo.osaled ON dbo.osaleh.osaleh_osalehID=dbo.osaled.osaled_osalehID WHERE --两表连接分页 SELECT * FROM( SELECT ROW_NUMBER() OVER ( ORDER BY osaleh_osalehID DESC ) AS rownum, dbo.osaleh.osaleh_osalehID, dbo.o

yii2.0AR两表联查

首先,建两个关联表. 表一 -- Table structure for article -- ---------------------------- DROP TABLE IF EXISTS `article`; CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id', `new` text, `t_id` int(11) DEFAULT NULL COMMENT '关联id', PRIMARY

MySQL两表索引优化

建表语句 CREATE TABLE IF NOT EXISTS `class`( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT(10) UNSIGNED NOT NULL, PRIMARY KEY(`id`) ); CREATE TABLE IF NOT EXISTS `book`( `bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT(10) UNSIGN

thinkjs——两表联查

问题来源: 现有一张texture以及一张tradename表,两者的联系是texture表中有一字段名为tid对应tradename表中的id,而tradename表中却有一字段type,要求根据tradename表中的type值为texture表分类显示. 解决方案: 1.欠打的麻烦又慢的solution 刚拿到手时,脑中想的第一种解决方案就是在查出texture表中现有的数据后,再取所有的tid集合,用in在texture表中用in查询,得到tradename表中的所有信息,然后再继续各种

springboot + mybatis plus实现多表联查分页

1 配置分页插件 public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } @Bean public PerformanceInterceptor performanceInterceptor() { PerformanceInterceptor performanceInterceptor

iwebshop两表联查

$tb_goods = new IQuery('goods as g'); $tb_goods->join='left join miao as m on m.goods_id=g.id'; $arr = $tb_goods->find(); $this->list = $arr;

Group by 两表联查取另一表与之关联数据的总数

使用group by 需要查询的字段 必须要放在group by 后面 SELECT U.UserLotterySn,count(W.Userlotterysn) as WinCount,U.ActivityCode,CertType,CertNumber,LotterySumCount,LotteryCounted,IsBigWin,U.CreateBy,U.CreateDateFROM T_UserLottery U JOIN T_WinningUser W on W.UserLottery

MySQL 多表查询分页

SELECT v.*, vt.id vid, vt.vote_id, vt. option, vt.poll FROM vote v JOIN vote_option vt ON v.id = vt.vote_id WHERE v.id IN ( SELECT t.id FROM ( SELECT id FROM vote ORDER BY id DESC LIMIT 0, 2 ) AS t ) ORDER BY id DESC

结合真实的测试实例,记录一次SQL语句辅助功能测试的场景(包含多表联查及子查询)

本文结合实例讲解一下 SQL 语句通过数据库辅助进行功能测试.希望阅读本文的小伙伴,能通过这个场景实例体会到SQL 语句在真实的功能测试时起到的作用 本次功能测试涉及的sql 知识点如下: 1 SELECT 查询 2 where 子句 3 count() 4 to_char() 5 group by 6 order by 7 两表联查(这里涉及left join) 8 子查询嵌套 实例中的需求文档 : 系统的测试界面:(不好意思,写文章的时候,想去截一个好一点的图片,测试环境无法登录了) 前提解