优化sql
在应用的开发过程中,由于初期数据量小,sql语言更注重功能的实现,但是当系统正式上线以后,很多sql就显示出性能问题,这时有问题的sql就成为整个系统的瓶颈,我们有必要对它进行优化。
通常优化sql的步骤是:1查看表的类型(存储引擎)是否选用恰当、2如果存储引擎使用得当,我们要确定执行效率低的sql然后进行优化。
通过show [global|session] status(global表示整个数据库,session表示当前连接)查看mysql的状态信息,当然我们主要关注的是各种sql的执行次数,因为通过查看各种sql的执行次数,我们才能判断使用哪种存储引擎更为合适。所以我们过滤一下结果使用show global status like 'Com_%'命令。其中主要的参数的意义:
Com_select:执行select语句次数
Com_insert:执行insert语句的次数,对于批量插入只记录一次
Com_update:执行update语句的次数
Com_delete:执行delete语句的次数
以上结果对所有的存储引擎的表都会累计,以下参数只对InnoDB存储引擎的表进行累计
InnoDB_rows_read:select查询返回的行数
InnoDB_rows_inserted:insert操作插入的行数
InnoDB_rows_updated:update操作更新的行数
InnoDB_rows_deleted:delete操作删除的行数
如果查询和插入语句的数量比较多,则采用MyISAM存储引擎,因为MyISAM不支持事务,而且对整个表加锁,InnoDB存储引擎的表之所以插入性能差,主要原因就是每次插入都开启一次事务,对于InnDB我认为提交性能的方法是对多个操作开启一个事务。
如果修改和删除语句的数量比较,则采用InnoDB,因为InnoDB对表加行锁
对于事务性应用通过Com_commit和Com_rollback查看事务提交和回滚的情况,如果数据库的回滚比较频繁,证明应用编写有问题。
Slow_quries慢查询的次数
如果表的存储引擎选择恰当,我们就应该定位执行效率低的sql,定位sql有两种方法1.通过慢查询日志(以后在说)2.通过show processlist命令查看所有线程的状态,是否锁表和实时查看sql执行的状态
通过以上方法定位了执行效率低的Sql以后,通过mysql(explain命令)分析sql的执行计划优化sql
例如:explain select sum(moneys) from sale a,company b where a.company_id=b.company_id and a.year=2012 \G;
假如sale表的year没有加索引,执行计划的结果key:null表示没有索引,rows:10000表示扫描的行数,从这些信息可以看出由于year没有加索引,对sale进行了全表扫描
我们给表sale创建索引create index idx_test_sale on sale(year);
然后explain select sum(moneys) from sale a,company b where a.company_id=b.company_id and a.year=2012 \G;
结果为key:idx_test_sal,rows=1
顺便介绍一下mysql的索引,以及怎么使用索引。
mysql里索引只支持两种方法Hash索引和BTree索引,MyISAM和InnoDB都只支持BTree索引,memory/heap存储引擎Hash和BTree索引都支持,但是这两种存储引擎不经常使用,这里不做介绍了。
使用索引的情况:
1.对于联合索引,只有第一列被引用时,才可能使用索引。
2.like关键字,只有通配符%不在第一个字符上,索引才可能被使用。
3.如果column_name is null column_name是索引列,那么可能会使用索引
为什么上述都用了可能这个词呢?因为有几个特例需要特别注意,很有可能存在索引,但不使用
1.mysql认为使用索引比全表扫描更慢,比如一个表的列的值大多数数据都是1-100之间
比如select * from table where key>1 and key<100;
2.用or连接的条件,如果第一条件里使用的是索引列or后的条件不是索引列,次数所有的索引都不使用。
3.如果列类型是字符串,那么在where条件中把字符串常量用引号引起来,否则的话列有索引也不会被用到,因为在插入的时候mysql会转化字符串类型,然后进行索引。
优化sql。
1.优化group by。mysql默认对group by col1,col2...后面的列进行排序这与显式制定order by col1,col2......类似,索引显式制定排序的列和order by后面的列一样,其实对mysql的性能没有影响,但是大多数情况下,group by后面的列是不必要排序的,所以我们使用在group by语句时显式指定order by null可以提高效率。
2.优化or条件。mysql内部对or的优化机制是拆分条件,然后做union操作,这种内部优化机制的效率已经很,但是问题转移到每个拆分后的语句上,只有拆分后在or前后的每个列上加索引,才能提高效率。
以上内容并不完善,以后补充.....
分享到:
相关推荐
第三,优化查询语句结构。避免在WHERE子句中使用复杂的表达式和函数,因为这可能使索引失效。尽量减少子查询的使用,考虑使用JOIN操作替代,或者使用临时表来存储中间结果。同时,避免过度使用SELECT *,只选取需要...
### MySQL优化之SQL语句与索引优化 #### 数据库设计合理性 在MySQL数据库的优化过程中,合理设计数据库(表)至关重要。一个合理的数据库设计能够有效地提高查询性能、减少数据冗余并确保数据完整性。 - **3NF**...
- **数据库范式理论**:介绍第一范式到第三范式,理解规范化在数据库设计中的作用,以及过度规范化可能带来的问题。 2. **查询优化策略** - **避免全表扫描**:通过合理使用索引,避免对大表进行全表扫描,减少I/...
MySQL性能优化是一个涵盖广泛的主题,涉及多个层面,包括SQL语句优化、索引优化、数据库表结构优化、系统级配置优化以及服务器硬件优化。以下是对这些方面进行详细说明: 1. **SQL语句优化** - **慢查询日志**:...
"MYSQL第三方库文件"通常指的是为了扩展MySQL功能或者优化特定操作而引入的非官方库或模块。这些库文件可能包含了各种功能,比如连接管理、数据处理、性能优化等。下面将详细介绍MySQL第三方库文件的相关知识点: 1...
第3课 查询优化技术理论与MySQL实践(一)------子查询的优化(一) 第4课 查询优化技术理论与MySQL实践(二)------子查询的优化(二) 从理论看,子查询包括的内容和范围,建立清晰的概念 从实践看,MySQL的子查询...
通过遵循上述查询优化和 SQL 编写注意事项,我们可以提高 MySQL 的查询效率,减少数据库的负载。但是,需要注意的是,索引不是越多越好,需要根据实际情况选择合适的索引方式。同时,SQL 编写也需要遵循一定的规范,...
5. **性能监控与分析**: 使用MySQL提供的Performance Schema或第三方工具(如Percona Toolkit),收集并分析性能指标,识别性能问题,如锁等待、慢查询等。 6. **定期维护**: 定期进行数据库维护,如重建索引、清理...
遵循第三范式(3NF)进行数据库规范化,但也要注意过度规范化可能导致的查询性能下降。 5. **分区与分表**:对大表进行分区或分片可以分散I/O负载,提高查询效率。水平分区(分片)是将数据分布在多个物理服务器上...
还有如Percona Toolkit、pt-query-digest等第三方工具,能帮助分析和优化SQL性能。 11. **优化器统计信息**:MySQL的查询优化器依赖于统计信息来决定执行计划,定期运行`ANALYZE TABLE`可以更新这些统计,确保优化...
标题提到的“如何查询mysql中执行效率低的sql语句”,通常我们可以通过以下方法来定位和分析低效的SQL: 1. **启用慢查询日志**:如描述中所述,配置`my.cnf`或`my.ini`文件,添加`--log-slow-queries`选项,这会...
本文将详细讲解如何通过两种主要方式定位并优化执行效率较低的 SQL 语句。 首先,我们来看第一种方式:使用慢查询日志。慢查询日志是 MySQL 提供的一种监控工具,它可以帮助我们识别那些运行时间过长的 SQL 语句。...
第三,注意SQL的写法。使用JOIN操作时,确保正确指定JOIN条件,并优先选择小表作为驱动表,以减少数据处理量。此外,避免在SELECT语句中使用*,而是明确指定需要的字段,这样可以减少数据传输量,提高执行效率。 第...
MySQL性能优化与架构设计是数据库管理员、开发人员和系统管理员关注的重要领域,因为数据库性能直接影响到应用程序的响应速度和整体用户体验。本资料提供了一个全面的视角,深入探讨了如何优化MySQL的性能并进行有效...
MySQL性能优化是一个综合性的过程,涉及到SQL查询优化、数据库结构优化以及MySQL服务器配置等多个方面。通过上述方法和技术的应用,可以显著提高MySQL的运行效率,降低资源消耗,最终实现更好的用户体验和服务质量。
- 第三方工具:例如,SSMA(SQL Server Migration Assistant)是微软官方提供的工具,可以将SQL Server数据库转换为多种数据库,包括MySQL。其他商业工具如Navicat、Data Export Wizard等也提供了类似的迁移功能。 ...
另外,还可以使用开源工具如MySQL Workbench或第三方软件如DataCompare来实现同步。 3. **建立连接**:在VS2010中配置SQL Server和MySQL的连接字符串,确保能成功连接到两个数据库。 4. **设计数据流**:定义数据...
MySQL批量SQL插入性能优化是数据库管理员和开发人员面临的重要任务,特别是在处理大数据量的系统时。本文将深入探讨几种能够显著提升MySQL InnoDB存储引擎插入性能的方法。 首先,一种有效的优化策略是通过合并多条...