浅谈MySQL中优化sql语句查询常用的30种方法,mys

项目背景

有三张百万级数据表

知识点表(ex_subject_point)9,316条数据

试题表(ex_question_junior)2,159,519条数据 有45个字段

知识点试题关系表(ex_question_r_knowledge)3,156,155条数据

测量检验数据库为:mysql (5.7卡塔尔国

品类背景

有三张百万级数据表

知识点表(ex_subject_point)9,316条数据

试题表(ex_question_junior)2,159,519条数据 有45个字段

知识点试题关系表(ex_question_r_knowledge)3,156,155条数据

测验数据库为:mysql (5.7卡塔 尔(阿拉伯语:قطر‎

 

mysql中优化sql语句询问的30种艺术

1.对查询举办优化,应尽量幸免全表扫描,首先应思考在 where 及 order by 涉及的列上营造目录。

7、在 where 子句中应用参数,是不会促成全表扫描。

1.对查询实行优化,要尽量制止全表扫描,首先应思虑在 where 及 order by 涉及的列上创设目录。

 

2.应尽量防止在 where 子句中利用!=或<>操作符,不然将引擎放弃选择索引而开展全表扫描。

案例分析

图片 1

案例拆解深入分析:

SELECT ex_question_junior.QUESTION_ID
FROM ex_question_junior 
WHERE ex_question_junior.GRADE_ID=15

实行时间:17.609s (数十次执行,在17s左右徘徊卡塔尔国

优化后:给GRADE_ID字段加多索引后

实行时间为:11.377s(数10遍实践,在11s左右徘徊卡塔尔国

备注:我们日常在怎么着字段上建索引?

那是二个特别复杂的话题,须要对业务及数据充裕深入分析后再能得出结果。主键及外键平时都要有目录,别的要求建索引的字段应满足以下法则:

  a、字段出今后询问条件中,而且询问条件能够利用索引;

  b、语句施行效用高,一天会有几千次以上;

  c、通过字段条件可筛选的记录集比非常小,那数据筛选比例是有一些才合乎?

其生龙活虎从未固定值,要求依据表数据量来评估,以下是经验公式,可用来赶快评估:

小表(记录数小于10000行的表):筛选比例<百分之十;

大表:(筛选重临记录数)<(表总记录数*单条记录长度)/10000/16

单条记录长度≈字段平均内容长度之和 字段数*2

以下是风度翩翩对字段是不是须要建B-TREE索引的经历分类:

图片 2

mysql中优化sql语句询问的30种艺术: 

3.应尽量制止在 where 子句中对字段实行 null 值判定,不然将促成斯特林发动机扬弃使用索引而展开全表扫描,如:
select id from t where num is null
能够在num上安装暗许值0,确定保障表中num列未有null值,然后那样查询:
select id from t where num=0

8、在 where 子句中对字段进行表明式操作,是不会招致全表扫描。然而询问速度会变慢,所以尽量制止使用。

2、应尽量制止在 where 子句中对字段进行 null 值剖断,不然将招致发动机吐弃采取索引而开展全表扫描

select id from t where num is null

但是不要给数据库留NULL,尽只怕的利用 NOT NULL填充数据库.

备注、描述、批评之类的能够安装为 NULL,其余的,最佳不要接纳NULL。

不要感觉 NULL 没有须要空间,举个例子:char(100) 型,在字段建登时,空间就一定了, 不管是还是不是插入值(NULL也含有在内卡塔 尔(阿拉伯语:قطر‎,都以挤占 100个字符的长空的,借使是varchar那样的变长字段, null 不占用空间。

能够在num上安装暗中同意值0,确认保障表中num列未有null值,然后那样查询:

select id from t where num = 0

1.对查询进行优化,应尽量幸免全表扫描,首先应思索在 where 及 order by 涉及的列上组建目录。 

4.应尽量防止在 where 子句中动用 or 来连接条件,不然将形成斯特林发动机扬弃采纳索引而举办全表扫描,如:
select id from t where num=10 or num=20
能够如此查询:
select id from t where num=10
union all
select id from t where num=20

案例深入分析

图片 3

试行时间是1.064s

案例深入分析:

在mysql数据库中对字段实行null值决断,是不会丢掉行使索引而进行全表扫描的。

图片 4

SELECT ex_question_junior.QUESTION_ID
FROM ex_question_junior 
WHERE IS_USE is NULL

施行时间是:11.729s

图片 5

SELECT ex_question_junior.QUESTION_ID
FROM ex_question_junior 
WHERE IS_USE =0

进行时间是12.253s

光阴差不离肖似。

2.应尽量幸免在 where 子句中动用!=或<>操作符,不然将引擎舍弃使用索引而进展全表扫描。 

5.上边的查询也将导致全表扫描:
select id from t where name like '

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:浅谈MySQL中优化sql语句查询常用的30种方法,mys

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。