MySQL(优化)

explain 查看 sql 执行计划

explain select * from `t_message_info`

在这里插入图片描述

  • type:连接类型。(不要出现 ALL,至少是 RANGE)
  • key:使用到的索引。
  • key_len:索引长度。
  • rows:扫描行数。
  • extra:详细说明。

in 条件

in 条件中的值被存储在一个有序数组中,值的数量过多时,效率较低。所以,能用 between 的就不要用 in,能用连接的也不要用 in。

不要用 *

select * 增加了不必要的消耗,还增加了索引失效的可能性。所以,查询时要指定列。

不要用 % 前缀

like ‘%name’,这种模糊查询会导致索引失效。
可使用全文索引:

ALTER TABLE `user` ADD FULLTEXT INDEX `idx_name` (`name`);

模糊查询:

select * from `user` where match(`name`) against('zhangsan' in boolean mode);

limit 1

只查询 1 条数据时,使用 limit 1,可使 explain 结果中的 type 达到 const。

排序

如果要排序的列上没有索引,尽量少用。

or 条件

在 or 左右的两个条件中,如果有一列上没有索引,就会造成索引失效。可使用 union all 或 union 代替 or。

使用 union all 代替 union

union 需要将结果合并,然后排序,进行唯一性过滤,效率较低。如果两个结果中没有重复数据,可以使用 union all 代替 union。

分页

每页 10 条,第二页:

select * from `user` limit 20,10

当数据量很大时,效率较低,可使用 id 设置起始位置:

select * from `user` where `id`>29 limit 10

避免在 where 条件中计算

select * from `user` where `age`*2=36;

应该改成:

select * from `user` where `age`=36/2;

索引失效

在 where 条件中判空。(!=、<>)
like 中使用 % 前缀。
范围查询。(between、<、>)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值