zoukankan      html  css  js  c++  java
  • 【mysql】mysql中单列索引、联合索引、Join联表查询建立索引 和 EXPLAIN的分析使用

    2、创建联合索引,从坐到右分别为:userid、openId、name  

    2、 #### --------------  多表联合查询 update 2019/03/13  --------------- ####

    (8)在Join表的时候使用相同类型的例,并将其索引
    
    如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。
    
    而且,这些被用来Join的字段,应该是相同的类型的。例如:如果你要把 DECIMAL 字段和一个 INT 字段Join在一起,MySQL就无法使用它们的索引。对于那些STRING类型,还需要有相同的字符集才行。(两个表的字符集有可能不一样)
    
    //在state中查找company
    
    SELECT company_name FROM users
    
    LEFT JOIN companies ON (users.state = companies.state)
    
    WHERE users.id = $user_id"
    
    //两个 state 字段应该是被建过索引的,而且应该是相当的类型,相同的字符集

    使用示例:

    SQL语句:
    
    EXPLAIN 
        SELECT sl.*,s.student_name,c.course_name,t.term_name,cl.class_name FROM
        cmf_student_score_log sl LEFT JOIN cmf_student s ON s.sno=sl.sno
        LEFT JOIN cmf_class_members cm ON sl.sno=cm.sno                //红色这两个是走的 单列sno普通索引
        LEFT JOIN cmf_class cl ON cl.id=cm.class_id
        LEFT JOIN cmf_term t ON t.id=sl.term_id      //橙色这三个是走的id主键索引
        LEFT JOIN cmf_course c ON c.id=sl.course_id
        WHERE sl.delete_time is NULL
        AND sl.status=1
        ORDER BY sl.term_id DESC,sl.sno ASC
    ;

      结语:加上索引后,性能提升18倍。 0.018s ---> 0.001s

      #### --------------  多表联合查询 update 2019/03/13  --------------- ####

  • 相关阅读:
    Tarjan求LCA
    过滤器、监听器、拦截器的区别
    java操作Redis缓存设置过期时间
    Redis和Memcached区别,Redis的过期策略
    缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    Memcached和Redis在Linux下的安装
    jmeter学习
    用FastDFS一步步搭建文件管理系统
    version control
    关于Linux的防火墙命令和端口占用查询
  • 原文地址:https://www.cnblogs.com/xuzhengzong/p/8873451.html
Copyright © 2011-2022 走看看