首页 > 数据库 >mysql性能优化二

mysql性能优化二

时间:2023-04-12 21:03:49浏览次数:63  
标签:join where 性能 id 索引 mysql 优化 聚集 select


索引:高校检索数据的数据结构

索引能干吗呢‘?

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查

索引的种类:

B+Tree,hash,fulltext,R-Tree

索引的优点:

  1. 提高检索效率
  2. 降低排序成本--排序分组主要消耗的是我们的内存和CPU

索引的缺点:

  1. 更新索引的IO量
  2. 调整索引所导致的计算量
  3. 存储空间

是否需要创建索引?

  1. 交频繁的座位查询条件的字段应该创建索引
  2. 唯一性太差的字段不适合单独创建索引
  3. 更新非常频繁的字段不适合创建索引
  4. 不会出现在where语句中的字段不该创建索引

聚集索引和非聚集索引

聚集索引的叶子节点就是数据节点

聚集索引的条件:

   a.首先选择显示定义的主键为聚集索引;

   b.如果没有则选择第一个非NULL的唯一索引;

   c.以上都不满足就选择ROWID。

聚集索引表现:

  1. 索引的键值顺序决定了表中相应行的物理顺序,即表中行的存储顺序由聚集索引的键值顺序决定;
  2. 一个表只能有一个聚集索引;
  3. 索引列可能是多个(复合索引)。

适用场景(只针对innodb存储引擎,myisam不存在这说法)

       a.主键列,该列在where子句中使用并且插入是随机的。

  b.按范围存取的列,如pri_order > 100 and pri_order < 200。

  c.在group by或order by中使用的列。

  d.不经常修改的列,不能建立在自增列上。

  e.在连接操作中使用的列。

非聚集索引的叶子节点为索引节点,但是有一个指针指向数据节点

非聚集索引就是普通索引,仅仅是对表创建索引不会影响表的物理存储顺序,非聚集索引的写入顺序由时间顺序决定。

非聚集索引:

对更新频繁的表来说,表上的非聚簇索引比聚集索引和根本没有索引需要更多的额外开销。对移到新页的每一行而言,指向该数据的每个非聚簇索引的页级行也必须更新,有时可能还需要索引页的分理。

     适用场景

   a.常用于计算函数如sum/count的列;

   b.常用于join/order by/group by的列;

   c.查寻出的数据不超过表中数据量的20%。

非聚集索引

比如说一张表table,有属性id,name,birthday,gender

其中id自增主键,name为索引

执行select * from table where id=1

mysql性能优化二_聚集索引

MYI为MYIISAM的索引表,MYD为MYISAM的数据表

这样咱们就先通过id=1在MYI查找0X123这个编码,然后拿着这个编码去MYD中获取对应的数据,

执行select * from table where name='james'

mysql性能优化二_聚集索引_02

与上面的id为索引一样执行数据查找

聚集索引--Innodb

执行select * from table where id=1,数据和索引是在同一张表中,

mysql性能优化二_聚集索引_03

执行select * from table where name='james'

mysql性能优化二_数据_04

右边的树相当于是副的,如果查找name='james'时,先在右边的副树上根据name查找到对应的id,然后通过id再来左边的树上查找对应的数据。

注意:如果name='james'存在多条,则会返回多条数据,这就是咱们在使用mybatis查找一条数据时候会报一个异常,这个异常就是‘返回不止一条数据’。

最左前缀索引(多个列作为索引)

比如有一table1,属性a,b,c,d,其中a,b,c为一个索引

select * from table1 where  a=1  and b=2  and c=1  则索引生效

select * from table1 where  b=2  and a=1  and c=1 则索引失效

另外联合索引的第二列是默认会进行排序,

mysql性能优化二_非聚集索引_05

数据表相关锁

行锁

优点:粒度小

缺点:获取、释放所做的工作多,容易发生死锁,关于死锁

实现(Innodb)如下图

mysql性能优化二_聚集索引_06

表锁

mysql性能优化二_非聚集索引_07

页锁

mysql性能优化二_数据_08

查看表级锁的竞争使用状态变量

show status like 'table%'

查看行级锁的竞争使用状态变量

show status like 'innodb_row_lock%'

写sql的时候注意一下几点:

  1. 永远使用小结果集驱动大结果集(join)
  2. 只取出自己想要的列(不要用select * from table)-数据量大、排序占用空间大
  3. 仅仅使用有效条件过滤(ken_length)
  4. 尽量避免使用复杂的join和子查询--锁资源

在select语句前面加上explain可以查看实行情况,然后针对性的进行对sql进行调整优化

mysql性能优化二_聚集索引_09

圈起来的这几列是相对比较重要的,也就是你主要关注点。然后针对性的进行优化你的sql。至于这几列是各代表什么意义有什么区别,可以参照网上的,比如说:

join

优化:

  • 永远使用小结果集驱动大结果集
  • 保证被驱动表上的join条件字段已经被索引
  • join buffer(join_buffer_size)

查看join_buffer_size

show variable like 'join_%'

mysql性能优化二_聚集索引_10

oder by 

mysql性能优化二_数据_11

底层实现

mysql性能优化二_数据_12

最后总结一下性能优化:

mysql性能优化二_聚集索引_13

标签:join,where,性能,id,索引,mysql,优化,聚集,select
From: https://blog.51cto.com/u_11702014/6186216

相关文章

  • centos安装MySQL8记录
    1.卸载mariadb因centos7默认安装了mariadb,会造成依赖冲突,按下列方式进行卸载:rpm-qa|grepmariadb#如果出现mariadb-libs-5.5.68-1.el7.x86_64#执行rpm-emariadb-libs--nodeps2.下载  注意权限:(chmod-R777/var/lib/mysql)(chmod-R777/var......
  • mysql查询过程优化--理论及实践过程总结
    首先推荐一篇写的特别详细的帖子,感觉写的太好了。全看懂了,就不用看我下面的废话了。https://blog.52ipc.top/archives/149.html然后记录点自己解决的经验正式开始写一下我的优化过程:问题:MySQL查询count()from(括号里有七八个leftjoin),导致查询速度特别慢,结果大概是40s+1、......
  • A572Gr65钢板化学成分、A572Gr65力学性能、A572Gr65期货订轧
    一、A572Gr65钢板简介:ASTMA572系列钢是按美国标准生产的,主要用于制造输电线路钢管塔、通讯钢管塔、路灯杆、美化树和变电站构架等产品。该钢种具有低碳低硅,高强度,高韧性的特点,通过对微量元素的控制,增强了镀锌锌层的附着力,长期使用不发黑,完全保证了热浸镀锌的质量,并可进行各种表面......
  • python之封装mysql
     数据查询类封装1.功能分析可以连接不同sql数据库查一条数据,多条数据可以获取不同格式的数据2.封装成数据库查询类封装思路:数据库查询模块有多个功能,且需要复用,所以封装成类在构造方法中创建连接创建对象方法实现各种查询#-*-coding:utf-8-*-#@Time......
  • 漏洞-Oracle MYSQL Server 安全漏洞(CVE-2022-1292)
    https://blog.csdn.net/weixin_45839894/article/details/126158078openssl:relocationerror:openssl:symbolEVP_mdc2versionOPENSSinedinfilelibcrypto.so.1.1withlinktimereference建议先删掉/usr/bin/openssl......
  • mysql insert|replace语法
    insert语法replace语法版权声明:本文所有权归作者!商业用途转载请联系作者授权!非商业用途转载,请标明本文链接及出处!赞成、反驳、不解的小伙伴,欢迎一起交流!......
  • mysql 使用分区partition_name 作为条件查询
       SELECT*FROMmy_tablePARTITION(partition_name)WHEREcolumn_name='value';```将`my_table`替换为您的表名,将`partition_name`替换为您要查询的分区的名称,将`column_name`替换为您要用作条件的列的名称,将`'value'`替换为您要用作过滤器的值。......
  • 再次思考一下Mysql的ACID
    ACID是事务的特性:一致性、原子性、隔离性、持久性。(记不住的话,一原隔持-依然搁置)事务本身来讲,是具有强隔离性的。即一个事务想访问另外一个事务正在访问的数据,需要排队。这种强隔离性,导致并发情况下的访问性能受限。但是有的时候,隔离性弱一点,可以带来的并发访问性能的提升,这个正......
  • 给技术新人的ODPS优化建议
    数据开发基本都是从陌生到熟悉,但是写多了就会发现各种好用的工具/函数,也会发现各种坑,本文分享了作者从拿到数据到数据开发到数据监控的一些实操经验。写在前面本文档是组内的一份算法ODPS离线开发分享,仅列出了这些年积累下来的一些重要经验和结论,特别是在算法日常数据处......
  • mysql——date_format(),str_to_date()函数
    date_format():类似python中的strftime: 将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制输出格式selectdate_format(datetime的字段,‘%Y-%m-%d’)括号中前面是你要格式化的字段,后面是具体要格式化成什么样式。 str_to_date():类似python中的strptime:将字......