• 一个连表查询的优化

    普通类
    • 支持
    • 批判
    • 提问
    • 解释
    • 补充
    • 删除
    • 需求描述

    有3张表,一张表存放作文信息,一张存放成语信息,一张存放作文-成语对应信息,作文表中有10多万条记录,1篇文章对应N个成语,1个成语对应N个文章。想实现根据不同年级显示成语引用情况,并实现成语引用次数的排序。

    作文表结构如下:

    作文-成语信息对应表结构如下:

    • 解决思路

    思路1:采用原生sql,先对作文-成语表进行group by idiomId,即先选择idiomID的多少排序,然后再对比找出的articleId是否在作文表中,结果发现查询速度极慢,一个查询耗费10多s甚至更多,不是个好的办法。sql查询语句大致如下:

    1.       
    2. select idiomId,articleId, count(*) as numbers from lcell_article_idiom group by idiomId having articleId in(select id from lcell_article where theme="  
    3.                         + theme + ") order by numbers desc "  

     

    思路2:采用视图,及先从作文表中选出不同年级的作为,sql语句如下:     

    1. create view article_idiom_grade12 as select a.articleId,a.idiomId,b.theme from lcell_article_idiom as a, lcell_article as b  where a.articleId=b.id having a.articleId  in(select id from lcell_article where grade =12);  

    然后再从视图中查询,发现速度仍是很慢,百度后发现要对建立视图的表建立索引,发现速度仍是不够理想

     

    思路3:将生成的视图直接转换成表,然后在查询,sql语句如下:

    1. //建立视图  
    2. create view article_idiom_grade12 as select a.articleId,a.idiomId,b.theme from lcell_article_idiom as a, lcell_article as b  where a.articleId=b.id having a.articleId  in(select id from lcell_article where grade =12);  
    3.   
    4. //拷贝表  
    5. create table article_idiom_grade_9 as select * from article_idiom_grade9;  
    6.   
    7. //创建查询  
    8. if (grade > 0) {  
    9.             if (theme > 0) {  
    10.                 sql = "select idiomId, count(*) as numbers from article_idiom_grade_"  
    11.                         + grade  
    12.                         + " where theme = "  
    13.                         + theme  
    14.                         + " group by idiomId order by numbers desc ";  
    15.                 countSql = "select count(idiomId) from (select DISTINCT  idiomId from article_idiom_grade_"  
    16.                         + grade  
    17.                         + " where theme ="  
    18.                         + theme  
    19.                         + ") lcell_article_idiom";  
    20.             } else {  
    21.                 sql = "select idiomId, count(*) as numbers from article_idiom_grade"  
    22.                         + grade + " group by idiomId order by numbers desc ";  
    23.                 countSql = "select count(idiomId) from (select DISTINCT  idiomId from article_idiom_grade_"  
    24.                         + grade + " ) lcell_article_idiom";  
    25.             }  
    26.         }  

    速度减少到2s左右,勉强能接受了。。。

    大家有更好的办法就话我知一下~thx~

    • 标签:
    • 查询
    • 需求
    • 成语
    • 作文
    • 一个
    • 发现
    • 速度
    • 优化
    • 视图
    • idiomid
    • 思路
    • sql
  • 加入的知识群:
    学习元评论 (0条)

    评论为空
    聪明如你,不妨在这 发表你的看法与心得 ~



    登录之后可以发表学习元评论
      
暂无内容~~
顶部