mysql性能调优

来源:互联网 发布:vary支持那些软件 编辑:程序博客网 时间:2024/04/29 09:44

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在where子句中对字段进行null判断,否则会导致引擎放弃使用索引而进行全表扫描。

3.应尽量避免在where子句中使用!=或<>操作符,否则会导致引擎放弃使用索引而进行全表扫描。

4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

Egselect id from t where num = 1 or num = 2

可写成:select id from t where num = 1 union all select id from t where num = 2

5.in和not in要慎用,否则会导致全表扫描。

Egselect id from t where num in(1,2,3)

由于1,2,3连续,最好用between,可写成:

select id from t where num between 1 and 3

6.尽量避免使用模糊查询。(where like ‘%abc%’)

7.避免在where子句中使用参数。(因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时,必须在编译时进行选择。若在编译时建立访问计划,变量的值未知,因此无法作为索引选择的输入项)

Egselect id from t where num = @num可改写为:

select id from t with(index(索引名)) where num = @num(强制使用索引查询)

8.避免在where子句中对字段进行表达式操作。(egwhere num/2 = 1

9.避免在where子句中对字段进行函数操作。(egwhere substring(name,1,3)

10.避免在where子句中的“=”左边进行函数,运算。

11.避免写无意义的查询。(where 1 = 0

12.尽量用exists代替in

Egselect num from t where num in(select num from t1)改写为:

select num from t where exists(select 1 from t1 where num = t.num)

注:嵌套子查询效率相当低,可使用existsjoin语句

13.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型。(降低查询和连接的性能,增加存储开销,引擎在处理查询和连接时会比较字符串中的每一个字符,数字型字段只比较一次)

14.尽量使用varchar代替char,因为变长字段存储空间小,可节省存储空间,查询效率更高。

15.任何地方都不要使用select * from t类似的语句,用具体的字段来代替*

16.尽量使用表变量来代替临时表。

17.避免大事务操作,提高系统并发能力。

18.避免向客户端返回大数据量,若数据量过大,应考虑相应需求是否合理。

19.当知道查询的结果集只有一条记录,应使用limit 1

20.为搜索字段创建索引。

21.一定要为每张数据库表设置一个ID字段。(主键自增IDint类型,unsigned

22.使用ENUM代替varchar。(若字段的取值是有限固定的)

23.使用固定长度的表会更快。

说明:若表中的字段是固定长度的,表就会是“static”的,使用固定的表会提高mysql搜索的速度,因为固定的长度是很容易计算下一个数据的偏移量的。若字段不是固定的,每一次找下一条记录时都需要找表的主键。固定长度的表的缺点就是会浪费空间,空间固定,没有可变字段灵活。

24.要学会拆分长的deleteinsert语句

说明:当执行delete或insert操作,由于这两个操作是会锁表的,表锁住了,别的操作就不能做了。Apache会有很多的子进程或线程。所以,其工作起来相当有效率,而我们的服务器也希望有太多的子进程,线程和数据库链接,这是极大的占服务器资源的事情,尤其是内存。so,如果你有一个大的处理,你一定把其拆分,使用 LIMIT条件是一个好的方法。


建议:融会贯通,多实践多思考!

0 0
原创粉丝点击