首页 数据库 mysql教程 MySQL大数据查询性能优化教程(图)

MySQL大数据查询性能优化教程(图)

Jul 26, 2018 pm 04:42 PM
mysql性能优化

MySQL性能优化包括表的优化与列类型选择,表的优化可以细分为什么?  1、定长与变长分离;2、常用字段与不常用字段要分离;  3、在1对多,需要关联统计的字段上添加冗余字段。

一、表的优化与列类型选择

表的优化:

        1、定长与变长分离

                如 id int,占4个字节,char(4)占4个字符长度,也是定长,time即每一单元值占的字节是固定的。

                核心且常用字段,宜建成定长,放在一张表。

                而varchar,text,blob这种变长字段,适合单放一张表,用主键与核心表关联起来。

        2、常用字段与不常用字段要分离

                需要结合网站具体的业务来分析,分析字段的查询场景,查询频率低的字段,单拆出来。

        3、在1对多,需要关联统计的字段上添加冗余字段。

                看如下的效果:

22.png

                每个版块里,有N条帖子,在首页显示了版块信息和版块下的帖子数。

                这是如何做的

33.png

               如果board表只有前2列,则需要取出版块后,

               再查post表,select count(*) from post group by board_id,得出每个版块的帖子数。

二、列类型选择

        1、字段类型优先级

         整型>date

         time>enum

        char>varchar>blob,text

        整型:定长,没有国家/地区之分,没有字符集的差异。比如:

       tinyint 1,2,3,4,5 <--> char(1) a,b,c,d,e

       从空间上,都占1个字节,但是 order by 排序,前者快。原因,或者需要考虑字符集与校对集(就是排序规则);

       time定长,运算快,节省空间。考虑时区,写sql时不方便 where > `2018-08-08`;

       enum,能起到约束的目的,内部用整型来存储,但与cahr联查时,内部要经历串与值的转化;

       char定长,考虑字符集和(排序)校对集;

       varchar不定长,要考虑字符集的转换与排序时的校对集,速度慢;

       text/blob 无法使用内存临时表(排序等操作只能在磁盘上进行)

       附:关于date/time的选择,大师的明确意见,直接选 int unsgined not null,存储时间戳。

      例如:

      性别:以utf8为例

      char(1) ,3个字长字节

      enum('男','女'); 内部转成数字来存,多一个转换过程

      tinyint(), 定长1个字节

      2、够用就行,不要慷慨(如 smallint varchar(N))

      原因:大的字节浪费内存,影响速度。

      以年龄为例 tinyint unsigned not null,可以存储255岁,足够。用int浪费了3个字节;

      以varchar(10),varchar(300)存储的内容相同,但在表联查时varchar(300)要花更多内存。

      3、尽量避免用NULL()

      原因:NULL不利于索引,要用特殊的字符来标注。

      在磁盘上占据的空间其实更大(MySQL5.5已对null做的改进,但查询仍是不便)

三、索引优化策略

1、索引类型

        1.1 B-tree索引

        名叫btree索引,大的方面看,都用的平衡树,但具体的实现上,各引擎稍有不同,比如,严格的说,NDB引擎,使用的是T-tree.

       但抽象一下 B-tree系统,可理解为“排好序的快速查询结构”。

       1.2 hash索引

       在memory表里默认是hash索引,hash的理论查询时间复杂度为O(1)。

       疑问:既然hash的查找如此高效,为什么不都用hash索引?

       回答:

      1、hash函数计算后的结果,是随机的,如果是在磁盘上放置数据,以主键为id为例,那么随着id的增长,id对应的行,在磁盘上随机放置。

      2、无法对范围查询进行优化。

      3、无法利用前缀索引,比如在btree中,field列的值“helloworld”,并加索引查询 x=helloworld自然可以利用索引,x=hello也可以利用索引(左前缀索引)。

       4、排序也无法优化。

       5、必须回行,就是说通过索引拿到数据位置,必须回到表中取数据。

        2、btree索引的常见误区

       2.1 在where条件常用的列上加索引,例如:

       where cat_id = 3 and price>100;查询第三个栏目,100元以上的商品。

       误区:cat_id 上和price上都加上索引。

       错:只能用上cat_id 或 price索引,因为是独立的索引,同时只能用一个。

       2.2 在多列上建立索引后(联合索引),查询哪个列,索引都会将发挥作用

       误区:多列索引上,索引发挥作用,需要满足左前缀要求。

       以 index(a,b,c) 为例,(注意和顺序有关)

44.png

四、索引实验

        例如:select * from t4 where c1=3 and c2 = 4 and c4>5 and c3=2;

       用到了哪些索引:

       explain select * from t4 where c1=3 and c2 = 4 and c4>5 and c3=2 \G

      如下:

55.png

                                     注:(key_len : 4 )

五、聚簇索引与非聚簇索引

Myisam与innodb引擎,索引文件的异同

Myisam:由news.myd和new.myi两个文件,索引文件和数据文件是分开的,叫非聚簇索引。主索引和次索引都指向物理行(磁盘的位置)

innodb:索引和数据是聚在一起的,所以是聚簇索引。innodb的主索引文件上直接存放该行数据,次索引指向对主键索引的引用。

注意:innodb来说:

1、主键索引 即存放索引值,又在叶子中存储行的数据。

2、如果没有主键(primary key),则会unique key做主键。

3、如果没有unique,则系统生成一个内部的rowid做主键。

4、像innodb中,主键的索引结构中,即存储了主键值又存储了行数据,这种结构称为聚簇索引。

聚簇索引

优势:根据主键查询条目比较少时,不用回行(数据就在主键节点下)

劣势:如果碰到不规则数据插入时,造成频繁的页分裂

相关文章:

Mysql 性能优化

相关视频:

MySQL优化视频教程

以上是MySQL大数据查询性能优化教程(图)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何优化MySQL连接速度? 如何优化MySQL连接速度? Jun 29, 2023 pm 02:10 PM

如何优化MySQL连接速度?概述:MySQL是一种广泛使用的关系型数据库管理系统,常用于各种应用程序的数据存储和管理。在开发过程中,MySQL连接速度的优化对于提高应用程序的性能至关重要。本文将介绍一些优化MySQL连接速度的常用方法和技巧。目录:使用连接池调整连接参数优化网络设置使用索引和缓存避免长时间空闲连接配置合适的硬件资源总结正文:使用连接池

MySQL数据库备份与恢复性能优化的项目经验解析 MySQL数据库备份与恢复性能优化的项目经验解析 Nov 02, 2023 am 08:53 AM

在当前互联网时代,数据的重要性不言而喻。作为互联网应用的核心组成部分之一,数据库的备份与恢复工作显得尤为重要。然而,随着数据量的不断增大和业务需求的日益复杂,传统的数据库备份与恢复方案已无法满足现代应用的高可用和高性能要求。因此,对MySQL数据库备份与恢复性能进行优化成为一个亟需解决的问题。在实践过程中,我们采取了一系列的项目经验,有效提升了MySQL数据

MySQL性能优化实战指南:深入理解B+树索引 MySQL性能优化实战指南:深入理解B+树索引 Jul 25, 2023 pm 08:02 PM

MySQL性能优化实战指南:深入理解B+树索引引言:MySQL作为开源的关系型数据库管理系统,被广泛应用于各个领域。然而,随着数据量的不断增加和查询需求的复杂化,MySQL的性能问题也越来越突出。其中,索引的设计和使用是影响MySQL性能的关键因素之一。本文将介绍B+树索引的原理,并以实际的代码示例展示如何优化MySQL的性能。一、B+树索引的原理B+树是一

如何用PHP的PDO类实现MySQL的性能优化 如何用PHP的PDO类实现MySQL的性能优化 May 10, 2023 pm 11:51 PM

随着互联网的飞速发展,MySQL数据库也成为了许多网站、应用程序甚至企业的核心数据存储技术。然而,随着数据量的不断增长和并发访问的急剧提高,MySQL的性能问题也愈发突显。而PHP的PDO类也因其高效稳定的性能被广泛运用于MySQL的开发和操作中。在本篇文章中,我们将介绍如何利用PDO类优化MySQL性能,提高数据库的响应速度和并发访问能力。一、PDO类介绍

如何通过使用动态SQL语句来提高MySQL性能 如何通过使用动态SQL语句来提高MySQL性能 May 11, 2023 am 09:28 AM

在现代应用程序中,MySQL数据库是一个常见的选择。然而,随着数据量的增长和业务需求的不断变化,MySQL性能可能会受到影响。为保持MySQL数据库的高性能,动态SQL语句已经成为了提高MySQL性能的一种重要技术手段。什么是动态SQL语句动态SQL语句是指在应用程序中由程序生成SQL语句的技术,通俗地说就是把SQL语句当成字符串来处理。对于大型的应用程序,

MySQL性能优化:掌握TokuDB引擎的特点与优势 MySQL性能优化:掌握TokuDB引擎的特点与优势 Jul 25, 2023 pm 07:22 PM

MySQL性能优化:掌握TokuDB引擎的特点与优势引言:在大规模数据处理的应用中,MySQL数据库的性能优化是一个至关重要的任务。MySQL提供了多种引擎,每种引擎都有不同的特点和优势。本文将介绍TokuDB引擎的特点与优势,并提供一些代码示例,帮助读者更好地理解和应用TokuDB引擎。一、TokuDB引擎的特点TokuDB是一种高性能、高压缩率的存储引擎

如何通过垂直分区表来提高MySQL性能 如何通过垂直分区表来提高MySQL性能 May 10, 2023 pm 09:31 PM

随着互联网的高速发展,数据的规模不断扩大,对于数据库存储和查询效率的需求也越来越高。MySQL作为最常用的开源数据库,其性能优化一直是广大开发者关注的焦点。本文将介绍一种有效的MySQL性能优化技术——垂直分区表,并详细讲解如何实现和应用。一、什么是垂直分区表?垂直分区表是指将一张表根据列的特性进行分割,将不同的列存储在不同的物理存储设备上,从而提高查询效率

MySQL中的数据表大小管理技巧 MySQL中的数据表大小管理技巧 Jun 15, 2023 am 09:28 AM

MySQL数据库作为一种轻量级关系型数据库管理系统,被广泛应用于互联网应用和企业级系统中。在企业级应用中,随着数据量的增加,数据表的大小也不断增加,因此,对数据表大小进行有效地管理,对于保证数据库的性能和可靠性至关重要。本文将介绍MySQL中的数据表大小管理技巧。一、数据表划分随着数据量的不断增加,数据表的大小也不断增加,会导致数据库性能下降,查询操作变得缓

See all articles