mysql优化笔记

   首先查看sql执行计划,确定执行过程是否用到索引,是否全表扫描等 

 例:explain select * from servers

1:子查询,in 和 exists的区别: in主要先执行内查询后与外表比较,exists先查询外表后与内表比较判断是否满足条件,具体查询效率取决于查询条件内表数据与外表数据大小,以及查询条件是否包含索引.

2:not in ,is not null等非判断会导致索引失效,扫描全表

3:条件中用or,即使其中有条件带索引,也不会使用索引查询,除非or前后所有字段全部带索引

4;对于多列索引,不是使用的第一部分,则不会使用索引。

5:like的模糊查询以%开头,索引失效

6:如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引

7:如果表内容较小,不使用索引反而更快..

8:不使用ORDER BY RAND(),因为这样会导致数据列被多次扫描

例如:select id from `table_name` order by rand() limit 1000;

可以优化为select id from `table_name` t1 join (select rand()*(select max(id) from `table_name`) as nid) t2 on t1.id>t2.nid limit 1000;

9:分页查询.随着表空间数据的增加,limit分页查询会越来越慢,优化方案是提前获取,前一页最大行数,

例如:select id from `table_name` id>80000 limit 20;

10:分段查询,在一些查询过程中,查询条件范围过大,会导致查询缓慢,主要原因是扫描行数过多,这个时候可以分段查询,循环遍历然后合并结果集.

11:where 判断中避免出现null,因为null会导致查询放弃索引进行全表扫描.

12:like模糊查询出现%name%查询时,name字段添加索引但是不起作用,这时候需要使用全文索引,需要注意全文索引查询sql与普通索引查询语句的区别

select id from `table_name` where name like '%zhang%';

使用全文索引

select id from `table_name` where match(name) against('zhang' in boolean mode);

 

13:避免在where 子句中使用表达式操作,这会导致引擎放弃索引.

14:避免where子句中出现,column字段的类型与传入参数类型不一致出现的类型转换.

15:联合索引遵守最左前缀法则,常用的查询字段要放最前面,索引顺序很重要

16:特殊情况使用force index强制选择查询走指定索引.

17:范围查询,比如between,<,>等条件会导致后边的索引字段失效.

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值