MySQL索引以及查询优化的细致介绍
文章《MySQL查询剖析》讲述了运用MySQL慢查询和explain下令来定位mysql机能瓶颈的办法,定位出机能瓶颈的sql语句后,则需要对低效的sql语句进行优化。本文主要计议MySQL索引道理及常用的sql查询优化。
一个简略的对照测试
前面的案例中,c2c_zwdb.t_file_count表只要一个自增id,FFileName字段未加索引的sql施行状况如下:
2、以免select *
在解析的历程中,会将'*' 顺次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的工夫。
所以,应当养成一个需要什么就取什么的好习惯。
3、order by 语句优化
任安在Order by语句的非索引项或者有盘算表达式都将落低查询速度。
办法:1.重写order by语句以运用索引;
2.为所运用的列创立别的一个索引 3.绝对以免在order by子句中运用表达式。
4、GROUP BY语句优化
提高GROUP BY 语句的效率, 可以通过将不需要的记载在GROUP BY 以前过滤掉
低效:
SELECT JOB , AVG(SAL)
FROM EMP
GROUP by JOB
HAVING JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
高效:
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB = ‘PRESIDENT'
OR JOB = ‘MANAGER'
GROUP by JOB
5、用 exists 取代 in
许多时候用 exists 取代 in 是一个好的选中: select num from a where num in(select num from b) 用下面的语句替代: select num from a where exists(select 1 from b where num=a.num)
6、运用 varchar/nvarchar 取代 char/nchar
尽可能的运用 varchar/nvarchar 取代 char/nchar ,由于第一变长字段存储空间小,可以节俭存储空间,其次关于查询来说,在一个相对较小的字段内搜寻效率显然要高些。
7、能用DISTINCT的就不消GROUP BY
SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID
可改为:
SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10
8、能用UNION ALL就不要用UNION
UNION ALL不施行SELECT DISTINCT函数,这样就会减少许多无须要的资源。
9、在Join表的时候运用相当类型的例,并将其索引
要是利用程序有许多JOIN 查询,你应当确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。
并且,这些被用来Join的字段,应当是雷同的类型的。例如:要是你要把 DECIMAL 字段和一个 INT 字段Join在一起,MySQL就没法运用它们的索引。关于那些STRING类型,还需要有雷同的字符集才行。(两个表的字符集有可能不同)
本篇文章到这里就全部完毕了,对于MySQL的更多见识大家可以关注 百分百源码网 的MySQL教程栏目!!!
以上就是MySQL索引以及查询优化的细致介绍的细致内容,更多请关注 百分百源码网 其它相干文章!