查询删除的优化

直接limitSELECT phone FROM t_logis_phone LIMIT 14900, 50, [], 5.223ms
DISTINCTSELECT DISTINCT(`phone`) FROM t_logis_phone LIMIT 4650, 50, [], 11.839ms
按IDlimit2个字段SELECT logis_id, phone FROM t_logis_phone WHERE `id`>=9650 LIMIT 0, 50, [], 1.259ms
按IDlimit2个字段SELECT phone, id FROM t_logis_phone WHERE `id`>=9950 LIMIT 0, 50, [], 1.174ms
按IDlimit3个字段SELECT logis_id, phone, id FROM t_logis_phone WHERE `id`>=9950 LIMIT 0, 50, [], 1.662ms
删除没索引DELETE FROM t_logis_phone WHERE phone IN ('18211111111','18222222222','18233333333') , (), 522.648ms
删除加索引DELETE FROM t_logis_phone WHERE logis_id = 8 AND phone = '18744444444' , (), 2.062ms
删除按IDDELETE FROM t_logis_phone WHERE id = 103124, (), 1.587ms
 

DELETE FROM t_logis_phone WHERE id = 114260, (), 1.713ms

这个是再做项目的时候 删除比较旧的历史手机号的sql。

有想过几个方法 进行对比,这是我截取的查询的时间的样本。

 

总的来说直接limit 会再sql取到很多数据 之后offset 抛弃掉很多无用的数据, 总的来说会很慢。

所以我们直接再查询的时候就按id加入条件 ,结果速度会快4倍多。

但是查询3个字段会比查询两个字段也会时间多一点,所以 再select后面 尽量能少就少,够用就好。

 

在执行DISTINCT的时候我们发现速率会慢1倍左右,原因是sql在取出所有的数据之后要distinct 取到不一样的数据,实际上就少在执行排序和去重复的操作,比较耗时,所以 不是必须  不推荐DISTINCT。因为会比较慢

 

首先,我们这个数据库的索引是logis_id ,phone的联合索引

在删除的时候只where的phone的话,根据最左前缀原理,索引是利用不到,所以delete语句超级慢,500ms

而在加上索引之后 删除的速度直接提升了两个数量级。

还有,值得注意的是如果手机号的索引是VARCHAR类型的 在写sql的时候一定要'13888888888' 而不是直接传入int类型的数字,因为在sql优化解析的时候他不会利用这个索引,具体原因我也不清楚。 所以在想利用索引,但缺没有提高效率的时候,我们需要考虑where条件里字段的类型是否正确,可能有利用不到索引的可能。

在删除的时候直接利用主键索引,比联合索引会稍微快那么一丢丢,可能这就是b-tree的原因吧,不然我会觉得主键会快很多。

还有用主键直接等于和主键in某些 的sql中  速度还都差不多,感觉in这个条件比or快  ,但是没数据,望大神补上

 

其中手机号敏感数据已改成1111,2222类似的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天马行空波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值