共计 2539 个字符,预计需要花费 7 分钟才能阅读完成。
本篇内容主要讲解“MySQL 数据库性能优化的六大技巧分享”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“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_pcqWHEREemail_id= blahblah ANDpassword= blahblah ANDdeleted=0
之前我们提到,要避免使用 COUNT(*)。代码纠正如下(实例二):
SELECTemp_idFROMawesome_pcqWHEREemail_id= blahblah ANDpassword= blahblah ANDdeleted=0
现在回想一下,在实例一中,代码查询定位并返回“email_id”和“password”等于给定值的行数。在实例二中,进行了同样的查询,不同的是明确要求列出“emp_id”所有满足给定的标准的值。哪个查询更费时?
很显然,这两个实例都是同样费时的数据库查询,因为无意间,两个实例查询都进行了全表扫描。为了更好地读懂指令,执行如下代码:
EXPLAINSELECTemp_idFROMawesome_pcqWHEREemail_id= blahblah ANDpassword= blahblah ANDdeleted=0
在输出时,集中在倒数第二列:“rows”。假设我们已经将表填充了 100 个记录,它会在第一行显示 100,这是 MySQL 需要进行扫描用来计算查询的结果的行数。这说明了什么? 这需要全表扫描。为了克服这个弊端,则需要添加索引。
6. 添加索引
先从重要的说起:给每一个可能遇到的次要问题创建索引并不明智。过多的索引会导致效能减慢和资源占用。在进一步讨论之前,在实例中创建一个样本索引:
ALTERTABLE awesome_pcq ADDINDEX LoginValidate (email_id)
接下来,再次运行该查询:
EXPLAINSELECTemp_idFROMawesome_pcqWHEREemail_id= blahblah ANDpassword= blahblah ANDdeleted=0
请 注意运行后的值。不是 100,而是 1。因此,为了给出查询结果,MySQL 只扫描了 1 行,多亏先前创建的索引。你可能会注意到,索引只在电子邮件地址字段 创建,而查询对其他字段同样进行了搜索。这表明 MySQL 先执行了一个 cros-check,检查是否有在 WHERE 子句中的定义的值有索引指定,如果有 这样的值就执行相应的操作。
但是,它不是每次重复将减少到一个。例如,如果不是唯一的索引字段(如 employee names 列可以有两行相同的值),即使创建索引,也将有多个记录留下。但它仍然比全表扫描好。并且,在 WHERE 子句中指定列的顺序没有在这个过程中发 挥作用。例如,如果在上面的查询中,改变字段的顺序,使电子邮件地址出现在最后,MySQL 仍将遍历索引列的基础上。那么,就要在索引上动脑筋,注意如何 避免大量的全表扫描,并获得更好的结果。不过,这需要经历一个很长的过程。
到此,相信大家对“MySQL 数据库性能优化的六大技巧分享”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!