开发者社区> 问答> 正文

重写mysql select以减少时间并将tmp写入磁盘?mysql

我有一个需要几分钟的mysql查询,这不是很好,因为它用于创建网页。

使用三个表:poster_data包含有关各个海报的信息。poster_categories列出了所有类别(电影,艺术品等),而poster_prodcat列出了posterid编号及其类别,例如,一个海报将有多行,例如电影,印第安纳·琼斯,哈里森·福特,冒险电影等。

这是慢查询:

select * from poster_prodcat, poster_data, poster_categories where poster_data.apnumber = poster_prodcat.apnumber and poster_categories.apcatnum = poster_prodcat.apcatnum and poster_prodcat.apcatnum='623'
ORDER BY aptitle ASC LIMIT 0, 32 据解释:

说明

花了几分钟。Poster_data有80万行,而poster_prodcat有1700万行。使用此选择的其他类别查询几乎不会引起注意,而poster_prodcat.apcatnum ='623'大约有40万个结果,并且正在写到磁盘上

展开
收起
保持可爱mmm 2020-05-17 12:55:48 564 0
1 条回答
写回答
取消 提交回答
  • 希望对您有所帮助-http: //pastie.org/1105206

    drop table if exists poster; create table poster ( poster_id int unsigned not null auto_increment primary key, name varchar(255) not null unique ) engine = innodb;

    drop table if exists category; create table category ( cat_id mediumint unsigned not null auto_increment primary key, name varchar(255) not null unique ) engine = innodb;

    drop table if exists poster_category; create table poster_category ( cat_id mediumint unsigned not null, poster_id int unsigned not null, primary key (cat_id, poster_id) -- note the clustered composite index !! ) engine = innodb;

    -- FYI http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

    select count() from category count()

    500,000

    select count() from poster count()

    1,000,000

    select count() from poster_category count()

    125,675,688

    select count() from poster_category where cat_id = 623 count()

    342,820

    explain select p., c. from poster_category pc inner join category c on pc.cat_id = c.cat_id inner join poster p on pc.poster_id = p.poster_id where pc.cat_id = 623 order by p.name limit 32;

    id select_type table type possible_keys key key_len ref rows == =========== ===== ==== ============= === ======= === ==== 1 SIMPLE c const PRIMARY PRIMARY 3 const 1
    1 SIMPLE p index PRIMARY name 257 null 32
    1 SIMPLE pc eq_ref PRIMARY PRIMARY 7 const,foo_db.p.poster_id 1

    select p., c. from poster_category pc inner join category c on pc.cat_id = c.cat_id inner join poster p on pc.poster_id = p.poster_id where pc.cat_id = 623 order by p.name limit 32;

    Statement:21/08/2010 0:00:00.021: Query OK来源:stack overflow

    2020-05-17 13:01:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像