`

MySQL 查询优化技巧

 
阅读更多

 

瓶颈

众所周知,几乎所有大型项目的最终效率瓶颈,都来自于如何更高效的进行数据查询,不论是使用何种数据源。

而在 MySQL 中,大部分效率低下的查询,都是因为没有正确的使用索引。

可以说,合理有效的使用索引将会对 MySQL 的效率优化起到决定性的作用。

原则

索引是为了优化查询效率而存在的,正确的设置索引,将会使查询效率有质的飞跃。

索引并不是设置的越多越好,设置过多的索引,将会大大的影响非 SELECT 查询的执行效率。

将作为查询和排序条件次数最多的字段作为索引,是我们最常使用的设置原则。

技巧

索引也会被用来做其他的事情,比如我们经常使用唯一索引,来做一些特殊的规则限定,比如地图中的坐标唯一。

不过我始终认为,这个应该是程序应该做的事情,而数据结构的限制,只应该是最后的保障。

索引的使用,也存在一些“潜规则”,如果不弄清楚,很可能提高效率的愿望没有达到,查询反而变慢了。

以下的几种情况,对应字段的索引是无法生效的:

查询条件里有不等号

SELECT * FROM `t_user` WHERE `id` != 2 中,id 的索引将不会被使用。

查询条件里使用了函数

SELECT * FROM `t_user` WHERE DAY(`regTime`) = 6 中,regTime 的索引将不会被使用。

在JOIN操作中,主键和外键的数据类型不同

SELECT `C` . * , `U`.`name` AS `userName` FROM `t_user_city` AS `C` LEFT JOIN `t_user` AS `U` ON `U`.`id` = `C`.`userId` 中,如果 t_user 表的 id 字段和t_user_city 表的 userId 字段数据类型不同,那么这两个字段的索引将不会被使用。

查询条件里使用比较操作符 LIKE 和 REGEXP,只有在搜索模板的第一个字符不是通配符的情况下才能使用索引。

①SELECT * FROM `t_user` WHERE `name` LIKE ‘123%’ 和 ②SELECT * FROM `t_user` WHERE `name` LIKE ‘3’ 中, 查询能使用 name 的索引,而  查询却不行。

使用索引查询出的记录数量超过全表记录的30%,MySQL 会遍历全表。

SELECT * FROM `t_user` WHERE `isNovice` = 1 中,t_user 表所有的记录都会被遍历,因为 isNovice 只有 0 和 1 这两个值,记录数各占 50%,设置 isNovice 为索引没有任何意义。

索引的优化是双向的,不仅仅是数据库结构如何设计、索引如何定义,在程序中如何构造查询语句也是至关重要的。

除了注意以上的几条规则以外,还有一些构造的技巧,也可以帮助你提升查询的效率。

尝试使用 IN 代替 OR

SELECT * FROM `t_user` WHERE `id` = 2 OR `id` = 4 OR `id` = 6 OR `id` = 8 OR `id` = 10 和 ②SELECT * FROM `t_user` WHERE `id` IN (2, 4, 6, 8, 10) 中,的效率明显比  要高的多。

避免在查询条件中使用函数

SELECT * FROM `t_user` WHERE DATE(`regTime`) = ‘2010-02-01’ 和 ②SELECT * FROM `t_user` WHERE `regTime` > ‘2010-02-01’ AND `regTime` < ‘2010-02-02’中, 的效率明显比  要高的多。

使用简单的程序处理来代替数据库处理

SELECT `userId`, SQRT(POW(`unitX`, 2) + POW(`unitY`, 2)) AS `distance` FROM `t_map_unit` WHERE `userId` = 2 中,计算距离的操作完全可以由程序来做,或者在需要的时候再用程序计算。为了图一时方便,让数据库来运算,是得不偿失的。

尽量避免使用联合查询

SELECT `C` . * , `U`.`name` AS `userName` FROM `t_user_city` AS `C` LEFT JOIN `t_user` AS `U` ON `U`.`id` = `C`.`userId` 和 SELECT * FROM `t_user_city` 、SELECT `name` FROM `t_user` WHERE `id` IN (……) ,我更建议使用后者,实际上通过增加简单的程序处理就可以实现,但是效率上区别确是很大的,特别是当 2 个表的记录都很多的时候。两个查询有时候比一个更快,这完全取决于查询语句的复杂度。

我们要深刻的明白一个道理,只让数据库提供和保存数据就好,尽量不要让它做其他的事情。

它很脆弱,它很容易累,它对你很重要。哪怕多写数十行程序只能减少一次查询,也值得一试。

控制

优化的过程是持续的,能及时的发现问题、解决问题,是控制项目风险的精要所在。

我们可以通过很多方法来发现数据库查询的种种问题。

比如频繁的 SHOW FULL PROCESSLIST,然后记录那些频繁出现或者出现 copy tmp table 的语句,并解决它们。

但是这毫无疑问是个笨方法,我们可以使用更便捷的方式记录这些有问题的语句。

修改 MySQL 配置,记录查询速度较慢的查询

在 my.cnf 中增加如下配置选项:

long_query_time = 1
log-slow-queries = /data/mysql/slow.log

这样我们就能通过查看 /data/mysql/slow.log 这个文件,找到所有查询时间超过 1 秒的查询语句。

修改 MySQL 配置,记录没有使用索引的查询

在 my.cnf 中增加如下配置选项: 

log-slow-queries = /data/mysql/slow.log
log-queries-not-using-indexes

这样 /data/mysql/slow.log 将会记录所有没有使用索引的查询语句。

两个选项可以一起使用,这样我们基本上就可以抓住大多数的“问题查询”了。

再针对这些查询进行分析和研究,修改查询或修改索引设置,最终让它们不再在这个日志文件中出现。

如果最终这个日志文件中除了必要的遍历查询以外再无其它内容,你的项目至少在数据库上已经没有效率问题了。

另外,对于频繁进行数据修改操作的表,索引可能会损坏。

索引损坏后,将不会起任何作用,周期性的检查和优化是非常必要的。

希望本文能对你有所帮助,欢迎来信交流优化经验。

分享到:
评论

相关推荐

    sql查询优化(提高MySQL数据库查询效率的几个技巧)

    其他查询优化技巧 除了使用 Statement 进行绑定查询外,还有其他几种方法可以提高 MySQL 数据库查询效率: * 使用索引:在频繁查询的列上建立索引,可以提高查询效率。 * 优化 SQL 语句:使用 EXPLAIN 语句来分析 ...

    Mysql查询优化从入门到入土详解含示例(值得珍藏)

    MySQL查询优化是提升数据库性能的关键,尤其是在大数据量的背景下,优化查询可以显著提高应用程序的响应速度,降低...通过持续学习和实践,我们可以掌握更多的MySQL查询优化技巧,从而更好地应对不断增长的数据量挑战。

    MySQL数据库查询优化

    MySQL中书写SQL连接查询语句时的优化技巧。 预计时间1小时 第8课 查询优化技术理论与MySQL实践(六)------数据库的约束规则与语义优化 数据库的参照完整性(CHECKt NULL等)。什么是语义优化? MySQL是否支持语义...

    千金良方:MySQL性能优化金字塔法则.docx

    MySQL性能优化金字塔法则 ...通过阅读本书,大家将深入了解MySQL性能优化的各个方面,掌握实用的优化技巧,提高应用程序的性能和可靠性。本书适合开发人员、数据库管理员以及对MySQL性能优化感兴趣的读者阅读。

    提升MYSQL查询效率的10个SQL语句优化技巧.doc

    "MYSQL 查询效率优化技巧" 在数据库应用中,MySQL 查询效率对程序的执行速度有很大的影响。有效的处理优化数据库是非常有用的,尤其是大量数据需要处理的时候。以下是十个 SQL 语句优化技巧来提升 MYSQL 查询效率:...

    MySQL调优讨论:原理 优化 技巧

    二、MySQL优化策略 1. **查询重构**:通过分析慢查询日志,找出低效查询并进行重构,比如减少子查询,合并多条SQL,使用EXPLAIN分析查询执行计划。 2. **硬件升级**:增加内存容量,使用更快的SSD硬盘,或者分布式...

    MySQL性能优化 SQL优化方法技巧

    #### 三、SQL语句优化技巧 **1. 避免全表扫描** - 尽量使用索引来避免全表扫描,提高查询效率。 - 对于频繁查询的字段建立索引。 **2. 选择合适的数据类型** - 选择最适合数据特性的数据类型,以减少存储空间的...

    MySQL数据库优化SQL篇PPT课件.pptx

    MySQL数据库优化SQL篇PPT课件.pptx ...本PPT课件对MySQL数据库优化的重要知识点进行了详细的讲解,并提供了许多实用的优化技巧和方法。通过学习本PPT课件,可以提高数据库的性能和效率,提高开发效率和质量。

    MySQL数据库查询优化技巧

    MySQL数据库查询优化技巧是提升应用程序性能的关键因素,尤其是在处理大量数据时。以下是一些关键的优化策略: 1. **创建索引**:在频繁用于WHERE和ORDER BY子句的列上建立索引,能显著加快查询速度。索引使得...

    MySQL 性能优化技巧1

    本文将围绕标题“MySQL性能优化技巧1”和描述中的场景,探讨如何解决SQL查询效率低下的问题。 首先,描述中提到的问题是新功能上线后,某些列表查询耗时较长,原因是旧接口的SQL查询涉及多张表且编写不规范,导致了...

    mysql查询优化之索引优化

    MySQL查询优化是数据库管理中的关键环节,特别是在大数据量的场景下,索引优化能显著提升查询性能。本文将深入探讨“mysql查询优化之索引优化”这一主题。 首先,了解索引的基本概念至关重要。索引是数据库为了快速...

    MySQL性能优化和高可用架构实践.pptx

    通过阅读本书,读者可以系统地掌握MySQL的性能优化技巧和高可用性架构实践,有效地应对实际应用中可能出现的各种挑战。本书同时也包含了很多实践案例,帮助读者更好地理解和应用所学知识,达到学以致用的目的。 ...

    分析MySQL中优化distinct的技巧

    MySQL的优化器将`DISTINCT`操作转换为`GROUP BY`,使得查询在利用索引分组后,仅扫描一次所需的`nick`值。在新的执行计划中,`Using index for group-by`表明查询利用索引完成了分组操作,从而提高了效率。 通过...

    mysql优化笔记+资料

    这些笔记涵盖了MySQL优化的主要方面,包括查询优化、SQL编写技巧、数据库设计、存储引擎选择、服务器配置、硬件升级、定期维护以及使用各种工具进行监控和调优。通过这些方法,你可以有效地提升MySQL数据库的运行...

    mysql优化小技巧之去除重复项实现方法分析【百万级数据】

    本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...

    Mysql 优化技巧总结(自己整理)

    ### MySQL优化技巧总结 #### 一、MySQL慢查询日志(Slow Query Log)与mysqldumpslow工具 **慢查询日志**是MySQL提供的一种非常实用的功能,它能够帮助我们记录并分析那些执行时间较长的SQL语句,进而找出性能瓶颈并...

    MySQL索引原理及慢查询优化1

    MySQL作为广泛使用的开源关系型数据库,其索引机制和查询优化技巧是开发者必须掌握的基本技能。 1. **索引的目的** 索引的主要目标是提高查询速度,就像字典中的索引帮助快速定位单词一样。在数据库中,索引使得...

    MySQL优化技巧大全.pdf

    "MySQL优化技巧大全.pdf" MySQL优化技巧大全.pdf是一份关于MySQL数据库优化的详细指南,涵盖了多种MySQL数据库优化技巧和方法。以下是对该文件的总结和分析: 1. 根据当前时间计算年龄 MySQL提供了多种方式来计算...

    05-VIP-Mysql索引优化实战二.pdf

    一种常见的优化技巧是根据自增且连续的主键排序的分页查询。例如: ```sql select * from employees where id &gt; 90000 limit 5; ``` 这条SQL语句通过主键排序,查询从第90001开始的5行数据。执行计划对比发现,...

    从 0 开始带你成为MySQL实战优化高手

    本资源集合旨在帮助你从零开始,逐步深入理解MySQL,并掌握实战中的优化技巧。 首先,我们需要理解MySQL的基本架构。在“02 为了执行SQL语句,你知道MySQL用了什么样的架构设计吗.pdf”中,你会发现MySQL采用的是...

Global site tag (gtag.js) - Google Analytics