MySQL过程化SQL语⾔_mysql的查询过程和SQL语句优化⼀、mysql的查询过程:
客户端向MySQL服务器发送⼀条查询请求 服务器⾸先检查查询缓存,如果命中缓存,则⽴刻返回存储在缓存中的结果。否则进⼊下⼀阶段服务器进⾏SQL解析、预处理、再由优化器⽣成对应的执⾏计划 MySQL根据执⾏计划,调⽤存储引擎的API来执⾏查询 将结果返回给客户端,同时缓存查询结果。图⽰如下:
⼆、SQL优化建议:
1.对查询进⾏优化,应尽量避免全表扫描,⾸先应考虑在 where 及 order by 涉及的列上建⽴索引。 创建索引的格式: create index 索引名 on 表名(字段名[(字符长度)]);
2.应尽量避免在 where ⼦句中使⽤!=或<>操作符,否则将引擎放弃使⽤索引⽽进⾏全表扫描。数据库优化sql语句
3.应尽量避免在 where ⼦句中对字段进⾏ null 值判断,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描, 如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值, 然后这样查询: select id from t where num=0
4.应尽量避免在 where ⼦句中使⽤ or 来连接条件,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描。
5.下⾯的查询也将导致全表扫描: select id from t where name like '%abc%' 若要提⾼效率,可以考虑全⽂检索。
6.in 和 not in 也要慎⽤,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能⽤ between 就不要⽤ in 了: select id from t where num between 1 and 3
7.使⽤预编译查询。程序中经常根据⽤户输⼊来动态执⾏sql语句,这时应尽量使⽤参数化sql,不仅可以避免sql注⼊,还可以提⾼执⾏速度。
8.应尽量避免在 where ⼦句中对字段进⾏表达式操作,这将导致引擎放弃使⽤索引⽽进⾏全表扫描。 如: select id from t where num/2=100 应改为: select id from t where num=100*2
9.应尽量避免在where⼦句中对字段进⾏函数操作,这将导致引擎放弃使⽤索引⽽进⾏全表扫描。 如: select id from t where substring(name,1,3)='abc'--name以abc开头的id 应改为: select id from t where name like 'abc%' 。
10.调整where⼦句中的连接顺序。DBMS⼀般⾃上⽽下解析where⼦句,根据这个原理,表连接最好写在其他where条件之前,那些可以过滤掉最⼤数量记录。
11.很多时候⽤ 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) 但如果可以⽤表连接,则表连接⽐exists更有效率。
12.尽量使⽤数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。 这是因为引擎在处理查询和连接时会逐个⽐较字符串中每⼀个字符,⽽对于数字型⽽⾔只需要⽐较⼀次就够了。
13.任何地⽅都不要使⽤ select * from t ,⽤具体的字段列表代替“*”,不要返回⽤不到的任何字段。
14.避免频繁创建和删除临时表,以减少系统表资源的消耗。
15.尽量将多条sql语句压缩到⼀句中,因为每次执⾏sql的时候都要建⽴⽹络连接、进⾏权限校验、进⾏sql语句查询优化、发送执⾏结果,整个过程⾮常耗时。
16.当sql语句连接多个表时,使⽤表别名并把别名前缀于每个列名上可以减少解析时间。 待补充。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论