直接limit | SELECT phone FROM t_logis_phone LIMIT 14900, 50, [], 5.223ms |
DISTINCT | SELECT 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 |
删除按ID | DELETE 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类似的值