查询删除的优化

news/2024/7/10 5:06:10 标签: mysql, select, delete, 优化
直接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类似的值


http://www.niftyadmin.cn/n/1519607.html

相关文章

将ubuntu软件源换成清华源

sudo vi /etc/apt/sources.list 然后将文件替换为下面 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted universe multiverse # deb-src https://mirrors.tuna.t…

git 清除无效分支

现在 我们所有的分支是这样的 $ git branch -afeature/2018-10-17- * feature/2018-11-09-masterremotes/origin/feature/2018-07-09-remotes/origin/hotfix/2018-09-25-remotes/origin/hotfix/2018-09-26-remotes/origin/release/2018-10-17-…… 本地和远程的分支特别多 假…

git 删除分支提示: The branch '***' is not fully merged.

git 在删除分支的时候可以使用git branch -d featurename 也可以是git branch -D featurename 其中是有区别的 git branch -d 的时候如果本地分支没有被合并就会提示这个问题 git branch -D 是强制删除,所以直接执行 强制删除就好了。

mysql date_format 按年、月、日统计数据

平常给运营到处数据总是要求按日或按月区分 ,统计什么总量啊,金额啊,人数啊,或者某种情况的量啊。 按日期是最常见的 然后分组就可以起到很好的作用,直接一条sql ,不用写脚本了。 知识点:DATE…

python 好用的时间模块 arrow

转载自&#xff1a;诸葛老刘所有 https://blog.csdn.net/weixin_39791387/article/details/81566149 In [1]: import arrow # 基准的时区,第一种写法 In [2]: now arrow.now(local) In [3]: now Out[3]: <Arrow [2018-11-06T12:23:53.59470608:00]> # 切换时区的写…

装mysql 遇到的坑

转自stackoverflow上的支持最高的解决方法 You need to use one of the following commands. Which one depends on what OS and software you have and use. easy_install mysql-python (mix os)pip install mysql-python (mix os/ python 2)pip install mysqlclient (mix o…

Linux CA证书与https讲解

转自&#xff1a;https://www.cnblogs.com/Presley-lpc/p/9776463.html 1.什么是CA证书。 ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧&#xff1f;假设 A 公司的张三先生要到 B 公司去拜访&#xff0c;但是 B 公司的所有人都不认识他&#xff0c;他咋办捏&#xff1…

basic_consume() got multiple values for keyword argument 'queue'

在看RabbitMQ实战 高效部署分布式消息队列这本书的时候出现的问题。 把 channel.basic_consume(msg_consumer, queue"hello-queue", consumer_tag"hello-consumer") 改成 channel.basic_consume("hello-queue", msg_consumer, consumer_tag…