mysql索引优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 原文:mysql索引优化mysql 大数据分页和索引使用 使用覆盖索引 一个表建立在id,create_time上建立了索引。 如下2个sql语句,执行时间一样。 因为查询字段id被索引覆盖。
原文: mysql索引优化

mysql 大数据分页和索引使用

使用覆盖索引

  1. 一个表建立在id,create_time上建立了索引。
  2. 如下2个sql语句,执行时间一样。 因为查询字段id被索引覆盖。

    select id from order_manage where  create_time > '2014-01-01'
    order by create_time desc  limit 100000,10
    
    
    select a.id from order_manage a
    inner join ( select id from order_manage 
    where  create_time > '2014-01-01' 
    order by create_time desc limit 1000,10) b on a.id = b.id
  3. 如下2条sql,使用inner join要快一个数量级。 inner join影响结果集仍然是$start +30,但是数据获取的过程(Sending data状态)发生在索引文件中,而不是数据表文件,这样所需要的系统开销就比前一种普通的查询低一个数量级,而主查询的影响结果集只有30条,几乎无开销。但是切记,这里仍然涉及了太多的影响结果集操作

    其实也可以分成2条sql语句来做,第一条使用覆盖索引查询出id,在使用in查询出需要的字段数据。

    select * from order_manage where  create_time > '2014-01-01'
    order by create_time desc  limit 100000,10
    
    
    select * from order_manage a
    inner join ( select id from order_manage 
    where  create_time > '2014-01-01' 
    order by create_time desc limit 1000,10) b on a.id = b.id

上一页,下一页优化

  1. 背景,常见论坛帖子页 SQL: select * from post where tagid=$tagid order by lastpost limit $start, $end 翻页 。索引为 tagid+lastpost 复合索引
    挑战, 超级热帖,几万回帖,用户频频翻到末页,limit 25770,30 一个操作下来,影响结果集巨大(25770+30),查询缓慢。
  2. 每次查询的时候将该页查询结果中最大的 $lastpost和最小的分别记录为 $minlastpost 和 $maxlastpost

    上翻页查询为 
    select * from post where tagid=$tagid and lastpost<$minlastpost order by lastpost desc limit 30; 
    下翻页为 
    select * from post where tagid=$tagid and lastpost>$maxlastpost order by lastpost limit 30;
    使用这种方式,影响结果集只有30条,效率极大提升。

order by排序优化

  1. 如下sql :

    select * from user where area=’$area’ and sex=’$sex’ order by lastlogin desc limit 0,30;

    建立复合索引并, area+sex+lastlogin 三个字段的复合索引(注意顺序),order by的字段要在最后。where条件字段,唯一性最好的要在最前。

    Area+sex+lastlogin复合索引时(切记lastlogin在最后),该索引基于area+sex+lastlogin 三个字段合并的结果排序。
    也就是说,建立了复合索引,少了一次排序操作。
  2. 牢记数据查询只能使用一个索引,每个字段建立独立索引的情况下,也只能有一条索引被使用!
  3. 复合索引的使用是符合左边原则。a,b,c的复合索引
    abc,ab,a,可以使用索引,其他情况都不能使用索引。
    复合索引的使用原则是第一个条件应该是复合索引的第一列必须使用,并且不能夸列。ac是不能使用索引的。

msyql索引使用原则

  1. 牢记数据查询只能使用一个索引,每个字段建立独立索引的情况下,也只能有一条索引被使用!msyql会选择最优化的索引。当然你可以强制使用索引,不过不建议这么做。
  2. 在进行索引分析和SQL优化时,可以将数据索引字段想象为单一有序序列,并以此作为分析的基础。涉及到复合索引情况,复合索引按照索引顺序拼凑成一个字段,想象为单一有序序列,并以此作为分析的基础。
  3. 查询条件与索引的关系决定影响结果集

    • 影响结果集不是输出结果数,不是查询返回的记录数,而是索引所扫描的结果数。
    • 影响结果集越趋近于实际输出或操作的目标结果集,索引效率越高
    • 影响结果集与查询开销的关系可以理解为线性相关。减少一半影响结果集,即可提升一倍查询效率!当一条搜索query可以符合多个索引时,选择影响结果集最少的索引。
    • SQL的优化,核心就是对结果集的优化,认识索引是增强对结果集的判断,基于索引的认识,可以在编写SQL的时候,对该SQL可能的影响结果集有预判,并做出适当的优化和调整。
    • 如果索引与查询条件和排序条件完全命中,影响结果集就是limit后面的数字($start + $end),比如 limit 200,30 影响结果集是230. 而不是30.
    • 如果索引只命中部分查询条件,甚至无命中条件,在无排序条件情况下,会在索引命中的结果集 中遍历到满足所有其他条件为止。比如 select * from user limit 10; 虽然没用到索引,但是因为不涉及二次筛选和排序,系统直接返回前10条结果,影响结果集依然只有10条,就不存在效率影响
    • 如果搜索所包含的排序条件没有被索引命中,则系统会遍历是所有索引所命中的结果,并且排序。例如 Select * from user order by timeline desc limit 10; 如果timeline不是索引,影响结果集是全表,就存在需要全表数据排序,这个效率影响就巨大。再比如 Select * from user where area=’厦门’ order by timeline desc limit 10; 如果area是索引,而area+timeline未建立索引,则影响结果集是所有命中 area=’厦门’的用户,然后在影响结果集内排序。
  4. 基于影响结果集的理解去优化,不论从数据结构,代码,还是涉及产品策略上,都需要贯彻下去。核心就是小表驱动大表,索引的使用要筛选出最少的结果集。
  5. 涉及 limit $start,$num的搜索,如果$start巨大,则影响结果集巨大,搜索效率会非常难过低,尽量用其他方式改写为 limit 0,$num; 确系无法改写的情况下,先从索引结构中获得 limit $start,$num 或limit $start,1 ;再用in操作或基于索引序的 limit 0,$num 二次搜索。
  6. 外键和join尽量不用

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
1月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
5天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
43 18
|
1天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
26 9
|
4天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
16 7
|
3天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
23 5
|
7天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
50 7
|
1月前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
23天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
24 2
|
1月前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
79 3