Home  >  Article  >  Database  >  MySQL语句优化的方法与其基本原则

MySQL语句优化的方法与其基本原则

WBOY
WBOYOriginal
2016-06-07 16:13:56915browse

以下的文章主要介绍的是MySQL语句优化的正确方法与其基本原则,我们大家都知道MySQL语句的语句的实际应用以越来越来广泛,所以对其进行优化也是很重要的,以下的文章主要就是对MySQL语句优化的正确方法与其基本原则的具体描述。 MySQL语句优化的方法与原则1

以下的文章主要介绍的是MySQL语句优化的正确方法与其基本原则,我们大家都知道MySQL语句的语句的实际应用以越来越来广泛,所以对其进行优化也是很重要的,以下的文章主要就是对MySQL语句优化的正确方法与其基本原则的具体描述。

MySQL语句优化的方法与原则1、使用索引来更快地遍历表。

缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:

a.有大量重复值、且经常有范围查询( > , =,

b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;

c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工作。

MySQL语句优化的方法与原则2、在海量查询时尽量少用格式转换。

3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。

4、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

5、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。

6、只要能满足你的需求,应尽可能使用更小的数据类型:例如使用MEDIUMINT代替INT

7、尽量把所有的列设置为NOT NULL,如果你要保存NULL,手动去设置它,而不是把它设为默认值。

8、尽量少用VARCHAR、TEXT、BLOB类型

9、如果你的数据只有你所知的少量的几个。最好使用ENUM类型

MySQL语句优化的方法与原则10、正如graymice所讲的那样,建立索引。

以下是我做的一个实验,可以发现索引能极大地提高查询的效率:

我有一个会员信息表users,里边有37365条用户记录:

在不加索引的时候进行查询:

sql语句A:

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from users where username like ‘%许%’; </span></span></li></ol>

在Mysql-Front中的8次查询时长为:1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960条记录

sql语句B:

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from users where username like ‘许%’; </span></span></li></ol>

在Mysql-Front中的8次查询时长为:0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836条记录

sql语句C:

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from users where username like ‘%许’; </span></span></li></ol>

在Mysql-Front中的8次查询时长为:0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7条记录

为username列添加索引:

代码:

<ol class="dp-xml"><li class="alt"><span><span>create index usernameindex on users(username(6)); </span></span></li></ol>

再次查询:

sql语句A:

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from users where username like ‘%许%’; </span></span></li></ol>

在Mysql-Front中的8次查询时长为:0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960条记录

sql语句B:

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from users where username like ‘许%’; </span></span></li></ol>

在Mysql-Front中的8次查询时长为:0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836条记录

sql语句C:

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from users where username like ‘%许’; </span></span></li></ol>

在Mysql-Front中的8次查询时长为:0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7条记录

在实验过程中,我没有另开任何程序,以上的数据说明在单表查询中,建立索引的可以极大地提高查询速度。

另外要说的是如果建立了索引,对于like ‘许%’类型的查询,速度提升是最明显的。因此,我们在写sql语句的时候也尽量采用这种方式查询。

对于多表查询我们的优化原则是:

尽量将索引建立在:left join on/right join on … +条件,的条件MySQL语句优化的方法与原则语句中所涉及的字段上。

多表查询比单表查询更能体现索引的优势。

关于索引请参看这里MySQL索引详解,及MySQL高效运行优化

11、索引的建立原则:

如果一列的中数据的前缀重复值很少,我们最好就只索引这个前缀。Mysql支持这种索引。我在上面用到的索引方法就是对username最左边的6个字符进行索引。索引越短,占用的 磁盘空间越少,在检索过程中花的时间也越少。这方法可以对最多左255个字符进行索引。

在很多场合,我们可以给建立多列数据建立索引。

索引应该建立在查询条件中进行比较的字段上,而不是建立在我们要找出来并且显示的字段上

12、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。

这句话怎么理解决,请举个例子

例子如下:

如果在fields1和fields2上同时建立了索引,fields1为主索引

以下sql会用到索引

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from tablename1 where </span><span class="attribute">fields1</span><span>=’value1′ and </span><span class="attribute">fields2</span><span>=’value2′ </span></span></li></ol>

以下sql不会用到索引

代码:

<ol class="dp-xml"><li class="alt"><span><span>select * from tablename1 where </span><span class="attribute">fields1</span><span>=’value1′ or </span><span class="attribute">fields2</span><span>=’value2′ </span></span></li></ol>

13.索引带来查询上的速度的大大提升,但索引也占用了额外的硬盘空间(当然现在一般硬盘空间不成问题),而且往表中插入新记录时索引也要随着更新这也需要一定时间.

有些表如果经常insert,而较少select,就不用加索引了.不然每次写入数据都要重新改写索引,花费时间; 这个视实际情况而定,通常情况下索引是必需的.

MySQL索引详解,及MySQL高效运行优化

14在对查询效率有怀疑的时候,接用Mysql的Explain来跟踪查询情况.

用Mysql-Front是通过时长来比较,从查询时扫描字段的次数来比较更精确一些.

MYSQL EXPLAIN语句的extended 选项

MySQL优化查询语句Explain


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn