MYSQL查询优化心得

合集下载

控制MySQL查询的IO消耗与优化技巧

控制MySQL查询的IO消耗与优化技巧

控制MySQL查询的IO消耗与优化技巧数据库是现代应用开发中不可或缺的一部分,如何优化数据库的性能一直是开发人员关注的焦点之一。

而在MySQL这样的关系型数据库中,IO(Input/Output)消耗是影响性能的一个重要因素。

本文将介绍一些控制MySQL查询的IO消耗与优化技巧,帮助开发人员提升数据库的性能。

1. 合理使用索引索引是优化MySQL查询性能最重要的手段之一。

良好的索引设计可以减少IO消耗,提高查询效率。

首先,对于经常被查询的字段,应使用索引进行优化。

其次,对于组合查询条件,可以考虑创建组合索引。

此外,需要注意避免创建过多的索引,因为索引也需要占用存储空间,并且在插入、更新和删除操作时需要维护索引,增加了额外的开销。

2. 选择合适的存储引擎MySQL提供了多种存储引擎,如InnoDB、MyISAM等。

不同的存储引擎对IO消耗和性能有不同的影响。

通常情况下,InnoDB是较好的选择,它支持事务、提供了更好的并发性能,并且通过合理配置可以减少IO消耗。

而MyISAM在读密集型应用中表现更好,适合用于一些没有事务需求的场景。

3. 优化查询语句撰写高效的查询语句是减少IO消耗的关键。

一方面,可以通过合理的查询条件和限制返回的数据量来减少IO操作。

例如,可以使用LIMIT关键字限制返回的记录数目,避免返回大量无用数据。

另一方面,需要避免使用不必要的慢查询,如SELECT *等。

仅查询需要的字段能够减少IO消耗,并且提高查询效率。

4. 适当使用缓存MySQL提供了查询缓存功能,可以减少IO消耗。

通过设置合适的缓存大小和缓存时间,可以将常被查询的结果缓存起来,减少对磁盘的IO操作。

但是需要注意,对于更新频繁、数据变动较大的表来说,缓存可能会导致一致性问题,因此需要权衡选择适当的缓存策略。

5. 合理配置硬件和文件系统硬件设备和文件系统的配置也对MySQL的IO消耗有一定影响。

首先,硬盘的选择要尽量选择高性能的固态硬盘(SSD)而不是机械硬盘。

防止MySQL慢查询的方法与技巧

防止MySQL慢查询的方法与技巧

防止MySQL慢查询的方法与技巧概述:随着数据量的不断增长和业务逻辑的复杂性增加,数据库查询的性能问题成为了开发人员常常面临的挑战。

MySQL是一种常用的关系型数据库管理系统,为了提高查询的效率,减少慢查询的出现,我们可以采取一系列的方法和技巧。

本文将介绍一些常见的方法和技巧,帮助开发人员优化和防止MySQL的慢查询问题。

一、使用适当的索引索引是提高数据库查询性能的重要手段之一。

通过在表的列上创建索引,可以加快查询速度。

但是过多的索引和不适当的索引设置可能导致慢查询的问题。

所以使用适当的索引是非常关键的。

1.1 规避全表扫描全表扫描是指在没有使用索引的情况下,对整个表的每一行进行扫描。

全表扫描通常会导致查询速度变慢,特别是在大型表中。

在查询语句中尽可能使用索引,避免全表扫描。

1.2 使用联合索引联合索引可以包含多个列,通过多个列的组合进行查询。

适当地创建联合索引可以提高查询效率。

但是需要注意的是,并不是所有的列都适合创建索引。

一般情况下,选择性较高的列适合创建索引。

1.3 避免过多的索引虽然索引可以提高查询速度,但是过多的索引也会造成额外的开销。

索引需要占用额外的存储空间,并且在数据更新时需要维护索引的更新。

所以在设计表结构时需要谨慎选择需要创建索引的列,避免过多的索引。

二、合理优化查询语句除了使用适当的索引外,优化查询语句也是提高查询性能的重要手段之一。

下面介绍一些常见的查询语句优化方法。

2.1 使用LIMIT限制查询结果在开发中,往往只需要获取符合条件的少数几行数据。

如果没有使用LIMIT关键字限制查询结果,MySQL可能会返回所有符合条件的数据,这会导致查询效率变慢。

使用LIMIT关键字可以限制查询结果的数量,提高查询速度。

2.2 避免在WHERE子句中使用函数在查询语句的WHERE子句中使用函数会导致MySQL无法使用索引进行查询,进而使查询变慢。

应尽量避免在WHERE子句中使用函数,可以在查询之前进行数据处理,把函数操作放在查询之后。

(转)优化GroupBy--MYSQL一次千万级连表查询优化

(转)优化GroupBy--MYSQL一次千万级连表查询优化

(转)优化GroupBy--MYSQL⼀次千万级连表查询优化概述:交代⼀下背景,这算是⼀次项⽬经验吧,属于公司⼀个已上线平台的功能,这算是离职⼈员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,⽤户体验特别差,因此SQL优化任务交到了我⼿上。

这个SQL查询关联两个数据表,⼀个是攻击IP⽤户表主要是记录IP的信息,如第⼀次攻击时间,地址,IP等等,⼀个是IP攻击次数表主要是记录每天IP攻击次数。

⽽需求是获取某天攻击IP信息和次数。

(以下SQL语句测试均在测试服务器上上,正式服务器的性能好,查询时间快不少。

)准备:查看表的⾏数:未优化前SQL语句为:SELECTattack_ip,country,province,city,line,info_update_time AS attack_time,sum( attack_count ) AS attack_timesFROM`blacklist_attack_ip`INNER JOIN `blacklist_ip_count_date` ON `blacklist_attack_ip`.`attack_ip` = `blacklist_ip_count_date`.`ip`WHERE`attack_count` > 0AND `date` BETWEEN '2017-10-13 00:00:00'AND '2017-10-13 23:59:59'GROUP BY`ip`LIMIT 10 OFFSET 1000123456789101112131415161718先EXPLAIN分析⼀下:这⾥看到索引是有的,但是IP攻击次数表blacklist_ip_count_data也⽤上了临时表。

那么这SQL不优化直接第⼀次执⾏需要多久(这⾥强调第⼀次是因为MYSQL带有缓存功能,执⾏过⼀次的同样SQL,第⼆次会快很多。

数据库慢查询优化的方法与技巧

数据库慢查询优化的方法与技巧

数据库慢查询优化的方法与技巧数据库是现代应用程序中不可或缺的组成部分,它负责存储、管理和提供数据。

然而,随着数据量的增长和复杂查询的增加,数据库查询性能可能会变得缓慢。

在这篇文章中,我们将探讨一些常见的数据库慢查询优化方法和技巧,帮助您提高数据库查询的执行效率。

1.适当的索引策略索引是提高数据库查询速度的重要手段之一。

通过对经常被查询的列创建索引,可以减少数据库查询的扫描次数,从而提高查询性能。

然而,过多或不恰当的索引可能会导致性能下降。

因此,在进行索引优化时,在经常被查询的列上创建适当的索引,并避免索引重叠和冗余是非常重要的。

2.优化SQL查询语句良好的SQL查询语句可以显著提高数据库的执行效率。

首先,避免使用SELECT *语句,因为它会返回所有列的数据,而不仅仅是需要的数据。

其次,尽量避免使用复杂的子查询和嵌套查询,这些查询可能会导致性能下降。

此外,合理利用JOIN和WHERE子句来限制查询结果的数量,从而提高查询性能。

3.合理分配硬件资源数据库的性能不仅取决于软件层面的优化,还与硬件资源的分配有关。

确保数据库服务器具有足够的处理能力、内存和存储空间,可以提高数据库查询的执行效率。

此外,可以考虑使用更快的存储设备,如固态硬盘(SSD),以加快数据库的读写速度。

4.定期更新统计信息数据库在执行查询时,会根据统计信息生成查询执行计划。

因此,定期更新统计信息可以帮助数据库优化查询执行计划,从而提高查询性能。

可以使用数据库管理工具或定期脚本来更新统计信息,确保它们与数据库中的实际数据保持一致。

5.分区和分表技术在处理大型数据集时,分区和分表技术可以提高数据库查询的执行效率。

分区可以根据数据范围、哈希值或列表将数据划分为多个逻辑部分,并分别存储在不同的物理位置。

而分表是将大型表拆分成多个小表,每个小表包含部分数据。

这些技术可以减少查询的扫描范围,从而提高查询性能。

6.避免过多的数据库连接数据库连接是应用程序和数据库之间的通信通道。

mysql心得体会

mysql心得体会

mysql心得体会《MySQL 心得体会》在当今数字化的时代,数据的管理和处理变得至关重要。

作为一名与数据打交道的从业者,我在工作中频繁接触到 MySQL 数据库,并积累了一些宝贵的心得体会。

MySQL 是一个开源的关系型数据库管理系统,因其易用性、性能和广泛的社区支持而备受青睐。

它在众多应用场景中发挥着关键作用,从简单的 Web 应用到复杂的企业级系统。

刚开始接触 MySQL 时,我被它丰富的功能和多样的操作命令所吸引。

创建数据库、表,插入、查询、更新和删除数据,这些基本操作看似简单,但要做到熟练和准确却需要不断的实践。

就拿创建表来说,不仅要考虑字段的数据类型、长度,还要合理设置主键、索引等,以提高数据的存储效率和查询性能。

在实际应用中,我深刻体会到了索引的重要性。

合适的索引可以大大提高查询速度,减少数据库的响应时间。

然而,过度使用索引或者创建不合理的索引也可能会带来负面效果,比如增加数据插入和更新的开销。

因此,在设计数据库结构时,需要根据业务需求和数据访问模式,谨慎地选择和创建索引。

另外,SQL 语句的优化也是提升数据库性能的关键。

一个复杂的查询如果没有经过优化,可能会导致数据库长时间的阻塞,影响整个系统的运行效率。

通过合理使用 JOIN 操作、避免全表扫描、使用合适的函数和条件判断等技巧,可以显著提高 SQL 语句的执行效率。

数据的备份和恢复是数据库管理中不可忽视的环节。

无论是因为硬件故障、人为误操作还是其他意外情况,数据的丢失都可能给业务带来巨大的损失。

MySQL 提供了多种备份和恢复的方法,如使用mysqldump 命令进行逻辑备份,或者通过复制数据文件进行物理备份。

定期进行数据备份,并测试恢复过程的可行性,是保障数据安全的重要措施。

在处理大量数据时,分表和分区也是常用的技术手段。

通过将大表拆分成多个小表,或者按照一定的规则对表进行分区,可以提高数据的管理和查询效率。

但这也增加了数据库设计和维护的复杂性,需要在前期进行充分的规划和设计。

MySQL中的并行查询优化技巧

MySQL中的并行查询优化技巧

MySQL中的并行查询优化技巧MySQL是一种强大的关系型数据库管理系统,用于存储和管理大量的数据。

在处理大规模数据时,提高查询效率是非常重要的。

本文将探讨MySQL中的并行查询优化技巧,介绍如何通过并发执行来提高查询性能。

一、什么是并行查询?在传统的串行查询中,数据库会按照提交的顺序依次执行查询操作。

而并行查询是指,在执行查询过程中,将任务划分为多个独立的子任务,并同时执行这些子任务,最后将结果合并返回给用户。

通过并行查询,可以利用多核CPU、多线程或多个计算资源来加速查询操作,提高数据库的处理能力。

二、并行查询的优势并行查询具有许多优点,主要包括以下几个方面:1. 提高查询速度:通过同时执行多个子任务,可以减少查询的总体执行时间。

2. 充分利用资源:并行查询可以利用多核处理器、多线程等资源,充分发挥硬件的性能。

3. 改善用户体验:查询结果更快返回,用户可以更快地获取所需的数据。

三、并行查询的优化技巧1. 利用索引:在MySQL中,索引是提高查询性能的重要因素。

使用合适的索引可以减少数据扫描的次数,从而提高查询效率。

在并行查询中,通过建立适当的索引,可以减少子查询的数据访问时间,提高并行查询的效率。

2. 分区表:分区表是指将表按照一定的规则划分为多个子表,每个子表独立存储并处理数据。

通过使用分区表,可以将大型数据集划分为多个较小的数据集,从而加快查询速度。

在并行查询中,可以将子查询分配给不同的分区进行处理,提高整体查询效率。

3. 并行执行计划:在MySQL中,执行计划是指数据库系统根据查询语句生成的一个查询执行过程的计划。

通过对执行计划进行优化,可以提高查询的执行效率。

在并行查询中,可以通过调整执行计划中各个子查询的执行顺序,合理安排每个子查询的执行时间,从而实现并行执行。

4. 并发控制:在MySQL中,同时执行多个查询可能会引发并发冲突。

为了有效地进行并行查询,需要实施一些并发控制机制,以避免数据的不一致性和冲突。

MySQL中的多线程与并行查询优化技巧

MySQL中的多线程与并行查询优化技巧

MySQL中的多线程与并行查询优化技巧MySQL是一种常用的关系型数据库管理系统,被广泛应用于各种规模的应用程序中。

在处理大规模数据时,MySQL的性能往往成为一个关键问题。

多线程和并行查询是两个常见的优化技巧,可用于提升MySQL的性能和吞吐量。

本文将深入探讨MySQL中的多线程与并行查询优化技巧。

一、多线程优化多线程是一种通过同时执行多个线程来提高系统性能的技术。

在MySQL中,多线程技术可以用于提高并发查询和处理能力,从而提升整体性能。

以下是一些常见的多线程优化技巧。

1. 使用线程池线程池是一种管理和复用线程的技术,它可以避免频繁创建和销毁线程的开销。

在MySQL中,使用线程池可以降低线程创建和销毁的成本,并且可以根据系统负载动态调整线程池大小以适应不同的并发需求。

2. 合理配置并发连接数在MySQL中,连接数是指同时允许的客户端连接数量。

合理配置并发连接数可以充分利用多线程,并避免过多的连接导致系统性能下降。

过高的并发连接数可能会导致线程竞争和锁争用,而过低的并发连接数则可能导致系统无法满足用户需求。

因此,需要根据应用程序的需求和硬件资源来配置合适的并发连接数。

3. 使用并行复制并行复制是指在主从复制过程中允许并行执行多个复制线程。

通过使用并行复制,可以将复制过程中的计算任务分摊到多个线程上,从而提高整体复制性能。

在MySQL 5.7及更高版本中,可以通过配置参数来启用并行复制功能。

二、并行查询优化并行查询是指将单个查询任务拆分成多个子任务,并通过同时执行这些子任务来提高查询性能。

在MySQL中,可以通过以下方式来实现并行查询优化。

1. 分区表分区表是将大表拆分成多个小表的技术。

通过将数据按照某种规则(如范围、列表等)进行分区,可以将查询任务分配到不同的分区上并行执行,从而提高查询性能。

2. 并行查询在MySQL 5.7及更高版本中,引入了并行查询功能。

通过将查询任务拆分成多个并行执行的子任务,可以利用多核处理器的优势并发执行查询操作,从而提高整体查询性能。

如何解决MySQL查询缓慢或卡死的问题

如何解决MySQL查询缓慢或卡死的问题

如何解决MySQL查询缓慢或卡死的问题在开发和维护Web应用程序时,经常会面临MySQL查询缓慢或卡死的问题。

这不仅会影响用户体验,还会导致系统性能下降。

在本文中,我们将探讨如何解决这些问题,并提供一些可行的解决方案。

1. 优化查询语句查询语句的优化是解决MySQL查询缓慢的首要步骤。

首先,确保查询语句的正确性,检查是否有语法错误或逻辑错误。

其次,使用正确的索引来加速查询。

使用EXPLAIN语句来分析查询执行计划,确定是否能够充分利用索引。

如果没有适当的索引,可以通过添加合适的索引来解决查询缓慢的问题。

2. 优化数据库结构数据库的结构设计对查询性能有着重要影响。

首先,每个表应该根据其特点和关系进行适当的正规化和反规范化。

过度正规化可能导致过多的JOIN操作,从而降低查询性能。

另外,避免使用过多的触发器和存储过程,因为它们会增加数据库的负载。

此外,评估是否有必要使用分区表或分片技术来提高查询性能。

3. 调整服务器参数MySQL服务器的参数配置对查询性能有很大影响。

一些常用的参数包括缓存大小、连接数量、并发线程数量等。

增大缓存大小可以减少磁盘IO,提高查询性能。

适当增加连接数量和并发线程数量可以处理更多的并发请求。

然而,注意过度增加这些参数可能导致服务器资源不足。

因此,需要根据实际情况和服务器配置进行适当的调整。

4. 使用适当的存储引擎MySQL支持多种存储引擎,如InnoDB、MyISAM等。

每个存储引擎具有其独特的特点和适用场景。

InnoDB支持事务、并发性能更好,适合多写少读的场景。

MyISAM对于读性能更好,适合读多写少的场景。

因此,选择合适的存储引擎可以显著改善查询性能。

5. 分析慢查询日志MySQL提供了慢查询日志记录查询执行时间超过阈值的语句。

通过分析慢查询日志,我们可以找到需要优化的查询语句,以及可能的索引缺失或其他性能问题。

可以使用工具如pt-query-digest来分析慢查询日志,找到潜在的性能瓶颈。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

查询优化学习心得Mysql性能优化有两个方面,一个是逻辑查询,一个是物理查询。

逻辑查询主要从连接的等价转换,连接消除,条件下推等方式对语句进行简化。

子查询是逻辑优化过程中需要重点关注的对象,子查询用的不好,往往会造成过多的表扫描。

关于子查询的优化,需要注意以下几点:1,在执行计划中出现subQuery, Depented SubQuery的查询方式,说明子查询语句不能优化,查询语句按默认从内外往执行。

先执行子查询语句,得到一个中间结果集,再执行外层语句。

这种情况主要出现于非spj的子查询语句中,比如含有distinct ,group by 聚合函数,order by limit,union.和相关子查询。

2,可以进行优化的子查询语句表现为嵌套循环Nested Loop算法,连接方式可以是内联接(inner join)或者是半联接(anti-semi-join)如果说在mysql中,内联接的Nested Loop属于子查询展开的话,那么半联接类型的子查询一般是不能够展开的,属于半联接的运算符有exists,not exists,in,not in,半联接是一种查找算法,只要查找到等值数据立刻退出本次循环,not exists,not in则不同,需要全表扫描。

对于嵌套循环Nested Loop,mysql的一种优化方式是Materialized,对子查询语句先进行物化,再与外表进行Nested Loop在执行计划中,看到derived的查询类型,说明在Nested Loop中,该表作为驱动表,根据Nested Loop运算符,先遍历驱动表的每一行,针对每一行记录,再到内表中查找对应的记录。

驱动表为全表扫描的外表。

3,对于循套嵌套Nested loop算法,驱动表的索引并不重要,但查找的内表字段最好有索引,如果有索引,子查询将会优化成简单查询(simple),也许,这就是子查询最优的解法吧(转成了简单查询).4,>all,>any,>some运算符虽然是ansi联接标准,但是由于这些运算符在语义上并不直观,而且,这些运算符在查询优化阶段也会被转换成对应max,min运算符。

所以实际并不常用。

所以这类运算符也不能被优化。

=all,=some,=any 属于等值联接,它们可以被优化。

在sqlserver中,子查询都转换为嵌套循环Nested Loop.其性能受Nested Loop 算法约束。

5,在实际生产环境中,最常见的子查询优化是not in,not exists子查询,一般会将其转换成left join + where column is null。

再一个就是注意子查询和父查询的相应索引的使用。

当然,并非子查询就是不好的:对于两个表都比较小,使用子查询,较低的查找开销比联结更优胜.匹配只返回一个值,使用子查询,与必须联结整张表相比,只找录一条记录并替换它花费的开销要少很多匹配只返回相当少的值,而且查询列上没有索引,使用子查询,通常,单独的一次或者甚至数次查找所花费的开销都比散列联结少另,子查询也是必不可少,很多业务逻辑必须要用子查询来实现。

一些实验的例子:相关子查询select * from t4 where t4.id4 = any ( select t5.id5 from t5 where t5.b5 = t4.b4);非相关子查询 select * from t1 where a1 = any (select a2 from t2 where t2.a2 = 10);IN 操作符SELECT column_name(s) FROM table_name WHERE column_name IN(value1,value2,...)select * from t4 where t4.id4 in (1,3);ALLANYSOME操作符select * from t5 where t5.id5 > any ( select id4 from t4 where t4.id4>5);select * from t5 where t5.id5 > ALL ( select id4 from t4 where t4.id4>5);EXISTS操作符select * from t5 where exists ( select * from t4 where t4.id4>t5.id5);转化成同义的IN语句: select * from t5 where id5 in ( select id5 from t4 where t4.id4>t5.id5);SPJ查询:选择:select * from t4 where t4.id4=1;投影: select id4, b4 from t4;连接:select * from t4, t5 where t4.id4 = t5.id5;group by子查询:SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY CustomerTOP-N : SELECT TOP 50 PERCENT * FROM Customers; mysql 不支持等价于Mysql 中 select * from t4 limit 10;LIMIT & order by: select * from t4 order by id4 desc limit 2,5;select n1,n2,n3 from ta inner join tb on ta.n1= ta.n2现有表aname hota 12b 10c 15表b:name hotd 12e 10f 10g 8表a左连接表b,查询hot相同的数据select a.*,b.* from a left join b on a.hot = b.hot查询结果:name hot name hota 12 d12b 10 e10b 10 f10c 15 nullnull从上面可以看出,查询结果表a的列都存在,表b的数据只显示符合条件的项目再如表b左连接表a,查询hot相同的数据select a.*,b.* from b left join a on a.hot = b.hot查询结果为:name hot name hotd 12 a12e 10 b10f 10 b10g 8 nullnull再如表a右连接表b,查询hot相同的数据select a.*,b.* from a rightjoin b on a.hot = b.hot查询结果和上面的b left join a一样优化的另一个方面是物理查询。

在物理查询方面,主要影响性能的地方是IO和cpu使用资源。

对于优化物理查询,有一些建议:1,在保证实现功能的基础上,尽量减少对数据库的访问次数(可以用缓存保存查询结果,减少查询次数);2,通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;3,能够分开的操作尽量分开处理,提高每次的响应速度;4,在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;5,算法的结构尽量简单;6,在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECTCOL1,COL2 FROM T1;7,在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。

在没有建索引的情况下,数据库查找某一条数据,就必须进行全表扫描了,对所有数据进行一次遍历,查找出符合条件的记录。

在数据量比较小的情况下,也许看不出明显的差别,但是当数据量大的情况下,这种情况就是极为糟糕的了。

所以,优化查询最重要的就是,尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询。

具体要注意的:1.应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=02.应尽量避免在where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

3.应尽量避免在where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10union allselect id from t where num=204.in 和not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。

如:select id from t where num in(1,2,3)对于连续的数值,能用between 就不要用in 了:select id from t where num between 1 and 35.尽量避免在索引过的字符数据中,使用非打头字母搜索。

这也使得引擎无法利用索引。

关于物理查询的优化,重点放在索引的创建上。

索引对查询的速度有着至关重要的影响,索引也是进行数据库性能调优的起点。

比如,数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。

如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多)。

如果建立B-Tree 索引,则只需要进行log100(10^6)=3次页面读取,最坏情况下耗时30ms。

当应用程序进行SQL查询速度很慢时,想想是否可以建索引。

MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响。

(1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。

(2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。

在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。

(3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。

相关文档
最新文档