MySQL数据库优化中应遵循的原则
1。使用索引遍历表更快。
默认创建的索引是非集群索引,但有时不是最好的。在非聚集索引中,数据物理存储在数据页上。合理的索引设计应基于对各种查询的分析和预测:
a有大量重复值,并且经常有范围查询(>,=,< =)和按顺序按组排列的列,可以考虑建立群集索引;
b.通常同时访问多个列,每个列都有一个重复值,可以考虑建立组合索引。
C.复合指数应尽量使关键查询索引覆盖,必须使用最频繁的列。索引有助于提高性能,但并不是越多越好的指标,只是相对指标可以导致系统是低效的。用户增加了一个指标,每个表,并该指数收集维修将作出相应的更新工作。
2,在海量查询中尽可能少地进行格式转换
3、顺序和组:使用顺序和组的短语,任何指标有助于提高选择效果。
4,列上的任何操作都会导致表扫描。它包括数据库函数、计算表达式等。当查询完成时,尽可能将操作移到等号的右侧。
5、内、或子句经常使用工作表使索引无效。如果不产生大量重复的值,则可以将子语句分开。
6、只要你能满足你的需求,你应该使用尽可能小的数据类型:例如,使用MEDIUMINT int
7,尝试将所有列设置为null,如果您想保存null,请手动设置它,而不是将其设置为默认值。
8。仅用varchar、文本、BLOB类型
9、如果你的数据只有你知道。最好使用枚举类型
10,正如graymice所说,建立一个索引。
下面是我做的一个实验,您可以发现索引可以大大提高查询的效率。
我有一个会员信息表,用户,其中有37365个用户记录。
未索引时查询:
sql语句a:
代码:
复制代码代码如下所示:
从用户名如徐%的用户中选择*;
MySQL前端的8个查询很长:总共有960条记录,总共有960条。
sql语句b:
代码:
复制代码代码如下所示:
从用户名如徐%的用户中选择*;
MySQL前端的8个查询很长:总共有836条记录,总共有836条。
语句C:
代码:
复制代码代码如下所示:
从用户名如A的用户中选择*;
MySQL前端的8个查询很长:总共有7条记录,总共有7条。
在用户名列中添加索引:
代码:
复制代码代码如下所示:
创建索引usernameindex用户(用户名(6));
再查询:
sql语句a:
代码:
复制代码代码如下所示:
从用户名如徐%的用户中选择*;
MySQL前端的8个查询很长:总共有960条记录,总共有960条。
sql语句b:
代码:
复制代码代码如下所示:
从用户名如徐%的用户中选择*;
MySQL前端的8个查询很长:总共有836条记录,总共有836条。
语句C:
代码:
复制代码代码如下所示:
从用户名如A的用户中选择*;
MySQL前端的8个查询很长:总共有7条记录,总共有7条。
在实验过程中,我没有发现任何程序,上面的数据在单表查询中,索引可以大大提高查询速度。
另一种说法是,如果指数成立,如%。徐类型的查询,速度是最明显的。因此,我们在编写SQL语句时也尝试这样做。
我们对多表查询的优化原则是:
尝试在左/右连接上建立左侧连接的索引…+条件,条件语句中涉及的字段。
多表查询反映了索引优于单表查询的优点。
11、建立指标的原则:
如果一个数据列的前缀是很少重复,我们最好指标这个前缀,MySQL支持这个指标。我使用的指数是指数的6个字符的用户名左边。短的指标,占用硬盘空间少,和更少的时间花费在检索过程。这种方法可以指数达255字的最左边的字符。
在许多情况下,我们可以对多列数据的建立进行索引。
索引应该建立在查询条件下比较的字段上,而不是在我们要查找和显示的字段上。
12,热情地提出问题:在,或从句中经常使用工作表,即失败的索引。如果你不产生大量重复的值,可以被认为是分开的句子。
请举例说明这句话是怎么理解的。
例子如下:
如果指数在fields1和专业同时成立,fields1是主要指标
下面的SQL使用索引
代码:
复制代码代码如下所示:
SELECT * FROM tablename1哪里fields1 = 'value1'and专业= 'value2
下面的SQL不使用索引
代码:
SELECT * FROM tablename1哪里fields1 = 'value1'or专业= 'value2
{代码}
13。索引带来更快的查询速度,但索引也占用额外的硬盘空间。(当然,硬盘空间现在不是问题)。当将新记录插入到表中时,它也需要更新。
有些表如果经常插入,而不是选择,则没有索引。否则,每次写入数据都必须重写以花费时间;这个索引取决于实际情况,通常需要索引。
14。当我怀疑查询的效率时,我通常使用mysql的解释来跟踪查询。
您比较MySQL前端的时间长度,我认为从查询中扫描字段的数量更准确。