专栏首页老雷PHP全栈开发老雷mysql教程之查询索引优化

老雷mysql教程之查询索引优化

1.explain

  explain select * from sky_article where id>10 AND id<100 order by id desc
  explain select * from sky_district force index(upid)  order by upid desc ;

---------------------------------

id:1

select_type:SIMPLE 简单查询

table:null 查询的表

type: 显示连接使用了何种类型 由最差到最好

All、index、range、ref、eq_ref、const

possible_keys: 可能使用的列

key:决定采用哪个key

key_len:索引的字节数

ref:显示索引的列

rows:1 扫描行数

extra:返回索引列的描述 越来越差

using index where temporary filesort

------------------------------------

2.索引优化

为什么要用索引

1.索引减少了扫描行数

2.避免排序和临时表

3.将随机io变为顺序io

索引策略

独立的列 catid

多列索引 id catid orderindex

索引顺序 规则:从左往右 最左前缀 where id=1 order by orderindex

覆盖索引 选择的列都是在索引中 select id catid orderindex from table

使用索引扫描来做排序 索引的列选择 尽可能在where又在order

高区分的列 id catid orderindex

最多查询 应用中频繁用到的查询 catid gid orderindex 或者 catid status

gender age 地区 status //lasttime 频繁更新的索引

3.查询优化

1.减少从服务器获取额外数据

select * from sky_article 在列表页中不使用*

select id,catid,title,description from sky_article

2.使用覆盖索引查询

3.简单查询优化

    select id,catid,title,description from sky_article where id in(1,2,10) order by catid desc

切分查询操作

  delete from sky_article limit 10000
      select * from sky_article  limit 100;
      select * from sky_article  limit 1000000,100 order by id desc ;
      
      select * from sky_article id<max(id) limit 1

4.重构查询方式

尽可能让索引生效 减少数据库扫描行数

一个复杂查询还是多个简单的查询

left join 一条语句 实现 文章+蚊子分类

分解关联查询

      select * from tag
        join tag_post on tag_post.tagid=tag.id
        join post on tag_post.tagid=post.id
      where tag.tag='mysql'  

关联子查询优化

      select id,title from sky_post where  id in(select id from tag_post where tagdid=1)
      select id from tag_post where tagdid=1
      select id,title from sky_post where  id in(ids)

union 的限制

      select id from tag_post where tagdid=1
      limit 20
      union 
      select id from tag_post where tagdid=2
      limit 20
      limit 10

特定类型优化

count(*) count(1)

group by catid 和 distinct(catid)

limit

本文分享自微信公众号 - 老雷PHP全栈开发(L362606856),作者:雷日锦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学会常用sql操作语句

    LIKE 搜索某种模式 模糊匹配 title like '%中国%' '中国%' '%中国'

    老雷PHP全栈开发
  • 老雷PHP全栈开发教程之vuex

    本节课程内容主要讲解vuex的使用,Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

    老雷PHP全栈开发
  • websocket实现

    我们主要实现私聊和群聊两个功能,要在web端实现想微信QQ那样的即时通讯的功能,我们需要了解一下websocket。

    老雷PHP全栈开发
  • 巧用这19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    大数据技术架构
  • 效率提高N倍的19条MySQL优化秘籍

    出处:https://zhuanlan.zhihu.com/p/49888088

    用户2769421
  • 巧用这19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    java思维导图
  • 效率提高N倍的19条MySQL优化秘籍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    数据和云
  • 19条效率至少提高3倍的MySQL技巧

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    JAVA葵花宝典
  • 巧用这19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    JAVA葵花宝典
  • 巧用这19条MySQL优化,效率至少提高3倍

    MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select...

    Java团长

扫码关注云+社区

领取腾讯云代金券