MySQL数据库性能优化分析的六种技术
选择1。存储引擎
如果一个数据表需要事务处理,你应该考虑使用InnoDB,因为它完全符合ACID特性。建议如果事务处理不需要使用默认的存储引擎MyISAM。不要同时使用这两个存储引擎。想想看:在一个事务中,一些数据表使用InnoDB,而其余使用MyISAM。结果,整个主题将被取消。只有那些在交易过程中被带回到原来的状态,和提交的数据的其余部分将被转移,这将导致整个数据库的冲突。然而,有一个简单的方法可以利用在同一时间两个存储引擎的优势。大多数的MySQL套件包括InnoDB、编译器和链接列表。但如果你选择MyISAM,你仍然可以下载InnoDB独立,并使用它作为一个插件,这是一个非常简单的方式,不是吗
2。计数问题
如果数据表使用的存储引擎支持事务处理(如InnoDB),你不应该使用计数(*)计算数据表中的行数。这是因为产品类数据库使用计数(*)和收益最多的一个近似值,因为总有一些交易流程在给定时间运行。如果count(*)显然是用来产生的错误,这个错误的结果。
三.重复测试查询
最棘手的问题是如何不小心的错误,并导致错误的出现。相反,问题是,在大多数情况下,当错误出现时,应用程序或数据库联机。事实上没有实际的解决问题的办法,除非测试样本上运行的应用程序或数据库,数据库的查询只能通过大量测试几千记录样品确认。
4。避免全表扫描
通常,如果MySQL(或其他关系数据库模型)需要搜索或扫描数据表中的任何特定记录,它将使用全表扫描。此外,通常使用索引表解决全表扫描造成的低效问题的最简单方法。但是,正如我们在下面的问题中看到的,有一个错误的部分。
5。使用解释查询
当你需要调试时,解释是一个很好的命令,说明将在下面进行深入的探讨。
首先,创建一个简单的数据表:
复制代码代码如下所示:
(createtable'awesome_pcq
emp_id'int(10)notnull
默认'0',
full_name'varchar(100)notnull,
email_id'varchar(100)notnull,
password'varchar(50)notnull,
deleted'tinyint(4)notnull,
主键('emp_id)
整理= 'utf8_general_ci)
InnoDB引擎=
row_format =默认
这个数据表一目了然,共有五列,最后一列删除是一个布尔类变量标志检查账号是否是激活或删除。接下来,你需要填写采样记录(例如,100的员工记录)。正如你所看到的,主要的关键是emp_id.therefore,使用电子邮件地址和密码字段,我们可以很容易地创建一个查询来验证或拒绝登录请求,如下(例1):
复制代码代码如下所示:
selectcount(*)fromawesome_pcqwhere
email_id = 'blahblah'andpassword = 'blahblah'anddeleted = 0
我们前面提到过避免使用计数(*):
复制代码代码如下所示:
selectemp_idfromawesome_pcqwhere
email_id = 'blahblah'andpassword = 'blahblah'anddeleted = 0
现在回想一下,实例,代码查询所返回的email_id和密码等于给定值的行数。2的情况下,相同的查询执行,不同的是明确要求列出emp_id满足给定的标准值,查询更耗时。
显然,这两个实例是同样耗时的数据库查询,因为无意中,所有的两个实例查询都在整个表中进行了扫描:
复制代码代码如下所示:
explainselectemp_idfromawesome_pcqwhere
email_id = 'blahblah'andpassword = 'blahblah'anddeleted = 0
在输出端,它是集中在倒数第二列:行。假设我们填补了表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首先执行交叉检查该值是否定义WHERE子句中的索引,而如果采用这样一种价值,进行相应的操作。
然而,它不重复每次都将减少到一个。例如,如果不是唯一的索引字段(如员工姓名列可以有两行相同的值),即使是创建的索引,将有一批记录离开。但它仍然比所有表扫描,以便在列指定WHERE子句中不在这个过程中发挥的作用。例如,如果该字段的顺序是在上述查询改变,电子邮件地址出现在年底,和MySQL仍然会被遍历索引列的基础。然后,你应该盲目的指数,并注意如何避免大量的全表扫描,得到更好的结果。但是,这需要一个漫长的过程。