`
Sharpleo
  • 浏览: 574068 次
  • 性别: Icon_minigender_1
  • 来自: newsk
社区版块
存档分类
最新评论

MySQL数据库性能优化六大技巧

 
阅读更多
数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间。Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕。如果你是个数据库管理员,你很有可能已经在某个阶段遇到上述情况。因此,本文将介绍对MySQL进行性能优化的技巧和窍门。

1.存储引擎的选择

如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的。并且不要尝试同时使用这两个存储引擎。思考一下:在一个事务处理中,一些数据表使用InnoDB,而其余的使用MyISAM。结果呢?整个subject将被取消,只有那些在事务处理中的被带回到原始状态,其余的被提交的数据转存,这将导致整个数据库的冲突。然而存在一个简单的方法可以同时利用两个存储引擎的优势。目前大多数MySQL套件中包括InnoDB、编译器和链表,但如果你选择MyISAM,你仍然可以单独下载InnoDB,并把它作为一个插件。很简单的方法,不是吗?

2.计数问题

如果数据表采用的存储引擎支持事务处理(如InnoDB),你就不应使用COUNT(*)计算数据表中的行数。这是因为在产品类数据库使用COUNT(*),最多返回一个近似值,因为在某个特定时间,总有一些事务处理正在运行。如果使用COUNT(*)显然会产生bug,出现这种错误结果。

3.反复测试查询

查询最棘手的问题并不是无论怎样小心总会出现错误,并导致bug出现。恰恰相反,问题是在大多数情况下bug出现时,应用程序或数据库已经上线。的确不存在针对该问题切实可行的解决方法,除非将测试样本在应用程序或数据库上运行。任何数据库查询只有经过上千个记录的大量样本测试,才能被认可。

4.避免全表扫描

通常情况下,如果MySQL(或者其他关系数据库模型)需要在数据表中搜索或扫描任意特定记录时,就会用到全表扫描。此外,通常最简单的方法是使用索引表,以解决全表扫描引起的低效能问题。然而,正如我们在随后的问题中看到的,这存在错误部分。

5.使用”EXPLAIN”进行查询

当需要调试时,EXPLAIN是一个很好的命令,下面将对EXPLAIN进行深入探讨。

首先,创建一个简单的数据表:





CREATETABLE'awesome_pcq'(
'emp_id'INT(10)NOTNULL

DEFAULT'0',

'full_name'VARCHAR(100)NOTNULL,

'email_id'VARCHAR(100)NOTNULL,

'password'VARCHAR(50)NOTNULL,

'deleted'TINYINT(4)NOTNULL,

PRIMARYKEY('emp_id')

) COLLATE='utf8_general_ci'

ENGINE=InnoDB

ROW_FORMAT=DEFAULT



这个数据表一目了然,共有五列,最后一列“deleted”是一个Boolean类变量flag来检查帐号是活动的还是已被删除。接下来,您需要用样本记录填充这个表(比如,100个雇员记录)。正如你看到的,主键是“emp_id”。因此,使用电子邮件地址和密码字段,我们可以很容易地创建一个查询,以验证或拒绝登录请求,如下(实例一):





SELECTCOUNT(*)FROMawesome_pcqWHERE
email_id='blahblah'ANDpassword='blahblah'ANDdeleted=0



之前我们提到,要避免使用COUNT(*)。代码纠正如下(实例二):





SELECTemp_idFROMawesome_pcqWHERE
email_id='blahblah'ANDpassword='blahblah'ANDdeleted=0



现在回想一下,在实例一中,代码查询定位并返回“email_id”和“password”等于给定值的行数。在实例二中,进行了同样的查询,不同的是明确要求列出“emp_id”所有满足给定的标准的值。哪个查询更费时?

很显然,这两个实例都是同样费时的数据库查询,因为无意间,两个实例查询都进行了全表扫描。为了更好地读懂指令,执行如下代码:





EXPLAINSELECTemp_idFROMawesome_pcqWHERE
email_id='blahblah'ANDpassword='blahblah'ANDdeleted=0

在输出时,集中在倒数第二列:“rows”。假设我们已经将表填充了100个记录,它会在第一行显示100,这是MySQL需要进行扫描用来计算查询的结果的行数。这说明了什么?这需要全表扫描。为了克服这个弊端,则需要添加索引。

6.添加索引

先从重要的说起:给每一个可能遇到的次要问题创建索引并不明智。过多的索引会导致效能减慢和资源占用。在进一步讨论之前,在实例中创建一个样本索引:





ALTERTABLE'awesome_pcq'ADDINDEX'LoginValidate'('email_id')

接下来,再次运行该查询:





EXPLAINSELECTemp_idFROMawesome_pcqWHERE
email_id='blahblah'ANDpassword='blahblah'ANDdeleted=0



请注意运行后的值。不是100,而是1。因此,为了给出查询结果,MySQL只扫描了1行,多亏先前创建的索引。你可能会注意到,索引只在电子邮件地址字段创建,而查询对其他字段同样进行了搜索。这表明MySQL先执行了一个cros-check,检查是否有在WHERE子句中的定义的值有索引指定,如果有这样的值就执行相应的操作。

但是,它不是每次重复将减少到一个。例如,如果不是唯一的索引字段(如employee names列可以有两行相同的值),即使创建索引,也将有多个记录留下。但它仍然比全表扫描好。并且,在WHERE子句中指定列的顺序没有在这个过程中发挥作用。例如,如果在上面的查询中,改变字段的顺序,使电子邮件地址出现在最后,MySQL仍将遍历索引列的基础上。那么,就要在索引上动脑筋,注意如何避免大量的全表扫描,并获得更好的结果。不过,这需要经历一个很长的过程。

文章出自:PHPchina 

分享到:
评论

相关推荐

    mysql数据库性能优化

    ### MySQL数据库性能优化 #### 一、概览 在当今高度依赖互联网技术的世界里,数据库作为数据存储的核心组件,其性能直接影响着应用系统的响应速度和用户体验。MySQL作为一款广泛使用的开源关系型数据库管理系统,...

    解析MySQL数据库性能优化的六大技巧

    因此,本文将介绍对MySQL进行性能优化的技巧和窍门。1.存储引擎的选择如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的。并且不要...

    基于SQL数据库的性能优化问题分析.rar

    在IT领域,数据库性能优化是至关重要的,尤其是在大型企业或高并发系统中。SQL(Structured Query Language)数据库作为数据管理的核心工具,其性能直接影响到应用的响应速度和用户体验。本资料"基于SQL数据库的性能...

    mysql 高性能优化

    索引是MySQL数据库性能的关键因素。正确地创建和使用索引可以显著提高查询速度。书中会详细讲解如何选择合适的索引类型(如B树、哈希索引),以及如何设计有效的索引策略,包括主键和唯一索引的使用,多列索引的创建...

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...

    caoz的mysql性能优化教程

    MySQL性能优化是数据库管理员和...通过学习caoz的MySQL性能优化教程,你将掌握一系列实用技巧,使你的MySQL数据库达到最佳运行状态,满足业务需求,降低运维成本。无论是初学者还是经验丰富的DBA,都能从中获益匪浅。

    MySQL数据库考试练习题 mysql试题集 共28页.pdf

    2. **性能优化**:学习如何通过索引优化、查询优化等手段提升数据库的运行效率。 3. **安全性设置**:了解用户权限管理、加密技术等措施,保障数据库的安全。 ### 四、事务处理 1. **事务的基本概念**:理解事务的...

    mysql数据库设计原则

    本文将深入探讨MySQL数据库设计的关键原则,包括但不限于索引的合理使用、SQL语句优化技巧等。 #### 二、索引使用原则 索引是提高数据检索速度的有效工具之一,但在实际应用中如何高效地利用索引却是一门艺术。 -...

    mysql优化笔记+资料

    3. 监控数据库性能,使用工具如MySQL Performance Schema或Percona Toolkit进行诊断。 八、监控与调优工具 1. MySQL Monitor工具,如MySQL Workbench、phpMyAdmin等,帮助实时查看数据库状态。 2. 使用Percona ...

    php操作mysql数据库流程整理

    - **性能优化**:合理设计数据库表结构和索引,以及优化 SQL 查询语句,可以显著提升应用程序的性能。 - **资源管理**:及时释放不再需要的资源,如结果集等,有助于提高程序的运行效率。 以上就是 PHP 操作 MySQL ...

    mysql.zip_MYSQL数据库_mysql导入_mysql文件

    - 导入导出时,应考虑数据库性能和存储空间,适时进行索引重建和优化,提高查询效率。 - 定期备份数据库,以防数据丢失,使用`mysqldump`可以方便地创建备份。 - 对于敏感数据,应遵循数据加密和安全策略,保护...

    NetBeansIDE中连接MySQL数据库

    - **性能优化**:探索提高MySQL数据库性能的方法,如索引优化、查询优化等。 通过以上步骤,您可以成功地在NetBeans IDE中连接MySQL数据库,并进行基本的数据库操作。这不仅有助于加深对数据库管理的理解,还能提升...

    MySQL数据库调优技术大全

    通过以上详尽的技术介绍,我们可以看出MySQL数据库调优是一项复杂而细致的工作,它不仅涉及到数据库本身的配置和优化,还需要对硬件环境、操作系统以及应用层等方面有深入的理解。希望本文能够帮助大家更好地理解和...

    MySQL数据库工程师职业规划

    - 性能优化的基本方法。 - 数据库应用系统的生命周期及其设计、开发过程。 - 常用数据库管理和开发工具的使用能力。 #### 五、职业分类与发展路径 数据库工程师大致可以分为三大类: 1. **数据库设计工程师**:...

    Windows环境 Mysql数据库5.6.10

    MySQL数据库在Windows环境中安装与使用的详细教程 MySQL是一款开源、免费的关系型数据库管理系统,广泛应用于Web应用程序开发,因其高效性能和稳定性...在数据库安全和性能优化方面,也有许多技巧和最佳实践值得学习。

Global site tag (gtag.js) - Google Analytics