- 浏览: 208504 次
- 性别:
- 来自: 重庆
-
文章分类
最新评论
瓶颈
众所周知,几乎所有大型项目的最终效率瓶颈,都来自于如何更高效的进行数据查询,不论是使用何种数据源。
而在 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 将会记录所有没有使用索引的查询语句。
两个选项可以一起使用,这样我们基本上就可以抓住大多数的“问题查询”了。
再针对这些查询进行分析和研究,修改查询或修改索引设置,最终让它们不再在这个日志文件中出现。
如果最终这个日志文件中除了必要的遍历查询以外再无其它内容,你的项目至少在数据库上已经没有效率问题了。
另外,对于频繁进行数据修改操作的表,索引可能会损坏。
索引损坏后,将不会起任何作用,周期性的检查和优化是非常必要的。
希望本文能对你有所帮助,欢迎来信交流优化经验。
发表评论
-
分页,MySQL的SQL_CALC_FOUND_ROWS
2012-12-17 16:44 1435FOUND_ROWS() 函数 ,可以在调用包含LIMIT的 ... -
使用mysql的last_insert_id() 产生自增的id
2012-12-17 15:48 1128刚才查了下last_insert_id()相关资料,找到几篇不 ... -
innodb的记录锁、gap锁、next-key锁
2012-12-17 13:45 1431相关文章见: http://dev.mysql ... -
MySQL Innodb表死锁情况分析与归纳(转载)
2012-12-14 16:22 1997案例描述 在定时脚本运行过程中,发现当 ... -
MySQL连接超时
2012-12-13 20:41 1154在负载较重的MySQL服务器上,有时你偶尔会看到一些 ... -
mysql优化索引 —— Using filesort
2012-12-11 12:13 862用Explain分析SQL语句的时候,经常发现有的语句在 ... -
IN条件结果顺序问题
2012-11-23 14:42 714项目中需要记录用户的浏览历史,我的意见是前端直接存cook ... -
mysql那点事(行锁+not null + varchar)
2012-10-12 15:08 1716一。not null vs DEAFUL value ... -
关于mysql auto_increment所带来的锁表操作
2012-09-01 14:00 1641以前内容主要是对官方文档中的意译,并加入了一些自己的理解 ... -
mysql 与unicode
2012-08-29 15:36 1739UTF8字符集(转换Unicode表示)是存储Unico ... -
深入Mysql字符集设置
2012-08-29 14:46 59105 Jan 08 深入Mysql字符集设置 ... -
关于set names
2012-08-29 14:37 839<?php$conn=mysql_connect( ... -
MYSQL索引优化和in or替换为union all
2012-08-22 17:16 4085一个文章库,里面有两个表:category和article。c ... -
mysql读写分离(PHP类)
2012-08-18 18:08 3763自己实现了php的读写 ... -
mysql分表的3种方法
2012-08-02 14:39 867当一张的数据达到几百万时,你查询一次所花的时间会变多,如 ... -
MySql BLOB类型
2012-08-02 13:42 761MySql的Bolb四种类型 MySQL中,BLOB是一个二进 ... -
mysql多表联合查询
2012-07-18 19:16 1683我在工作中天天研究zen cart的程序,那个叫人痛苦,最近比 ...
相关推荐
其他查询优化技巧 除了使用 Statement 进行绑定查询外,还有其他几种方法可以提高 MySQL 数据库查询效率: * 使用索引:在频繁查询的列上建立索引,可以提高查询效率。 * 优化 SQL 语句:使用 EXPLAIN 语句来分析 ...
MySQL查询优化是提升数据库性能的关键,尤其是在大数据量的背景下,优化查询可以显著提高应用程序的响应速度,降低...通过持续学习和实践,我们可以掌握更多的MySQL查询优化技巧,从而更好地应对不断增长的数据量挑战。
MySQL中书写SQL连接查询语句时的优化技巧。 预计时间1小时 第8课 查询优化技术理论与MySQL实践(六)------数据库的约束规则与语义优化 数据库的参照完整性(CHECKt NULL等)。什么是语义优化? MySQL是否支持语义...
MySQL性能优化金字塔法则 ...通过阅读本书,大家将深入了解MySQL性能优化的各个方面,掌握实用的优化技巧,提高应用程序的性能和可靠性。本书适合开发人员、数据库管理员以及对MySQL性能优化感兴趣的读者阅读。
"MYSQL 查询效率优化技巧" 在数据库应用中,MySQL 查询效率对程序的执行速度有很大的影响。有效的处理优化数据库是非常有用的,尤其是大量数据需要处理的时候。以下是十个 SQL 语句优化技巧来提升 MYSQL 查询效率:...
二、MySQL优化策略 1. **查询重构**:通过分析慢查询日志,找出低效查询并进行重构,比如减少子查询,合并多条SQL,使用EXPLAIN分析查询执行计划。 2. **硬件升级**:增加内存容量,使用更快的SSD硬盘,或者分布式...
#### 三、SQL语句优化技巧 **1. 避免全表扫描** - 尽量使用索引来避免全表扫描,提高查询效率。 - 对于频繁查询的字段建立索引。 **2. 选择合适的数据类型** - 选择最适合数据特性的数据类型,以减少存储空间的...
MySQL数据库优化SQL篇PPT课件.pptx ...本PPT课件对MySQL数据库优化的重要知识点进行了详细的讲解,并提供了许多实用的优化技巧和方法。通过学习本PPT课件,可以提高数据库的性能和效率,提高开发效率和质量。
MySQL数据库查询优化技巧是提升应用程序性能的关键因素,尤其是在处理大量数据时。以下是一些关键的优化策略: 1. **创建索引**:在频繁用于WHERE和ORDER BY子句的列上建立索引,能显著加快查询速度。索引使得...
本文将围绕标题“MySQL性能优化技巧1”和描述中的场景,探讨如何解决SQL查询效率低下的问题。 首先,描述中提到的问题是新功能上线后,某些列表查询耗时较长,原因是旧接口的SQL查询涉及多张表且编写不规范,导致了...
MySQL查询优化是数据库管理中的关键环节,特别是在大数据量的场景下,索引优化能显著提升查询性能。本文将深入探讨“mysql查询优化之索引优化”这一主题。 首先,了解索引的基本概念至关重要。索引是数据库为了快速...
通过阅读本书,读者可以系统地掌握MySQL的性能优化技巧和高可用性架构实践,有效地应对实际应用中可能出现的各种挑战。本书同时也包含了很多实践案例,帮助读者更好地理解和应用所学知识,达到学以致用的目的。 ...
MySQL的优化器将`DISTINCT`操作转换为`GROUP BY`,使得查询在利用索引分组后,仅扫描一次所需的`nick`值。在新的执行计划中,`Using index for group-by`表明查询利用索引完成了分组操作,从而提高了效率。 通过...
这些笔记涵盖了MySQL优化的主要方面,包括查询优化、SQL编写技巧、数据库设计、存储引擎选择、服务器配置、硬件升级、定期维护以及使用各种工具进行监控和调优。通过这些方法,你可以有效地提升MySQL数据库的运行...
本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
### MySQL优化技巧总结 #### 一、MySQL慢查询日志(Slow Query Log)与mysqldumpslow工具 **慢查询日志**是MySQL提供的一种非常实用的功能,它能够帮助我们记录并分析那些执行时间较长的SQL语句,进而找出性能瓶颈并...
MySQL作为广泛使用的开源关系型数据库,其索引机制和查询优化技巧是开发者必须掌握的基本技能。 1. **索引的目的** 索引的主要目标是提高查询速度,就像字典中的索引帮助快速定位单词一样。在数据库中,索引使得...
"MySQL优化技巧大全.pdf" MySQL优化技巧大全.pdf是一份关于MySQL数据库优化的详细指南,涵盖了多种MySQL数据库优化技巧和方法。以下是对该文件的总结和分析: 1. 根据当前时间计算年龄 MySQL提供了多种方式来计算...
一种常见的优化技巧是根据自增且连续的主键排序的分页查询。例如: ```sql select * from employees where id > 90000 limit 5; ``` 这条SQL语句通过主键排序,查询从第90001开始的5行数据。执行计划对比发现,...
本资源集合旨在帮助你从零开始,逐步深入理解MySQL,并掌握实战中的优化技巧。 首先,我们需要理解MySQL的基本架构。在“02 为了执行SQL语句,你知道MySQL用了什么样的架构设计吗.pdf”中,你会发现MySQL采用的是...