文章 40
评论 417
浏览 67887
MySQL分页查询优化

MySQL分页查询优化

前言 Mysql慢查询优化,一直是开发中不可避免的问题,当然面试的时候也是。 今天的面试中,面试的最后一道题:“如何提供分页查询”,我自信的写下 LIMIT,认为此题十拿九稳,面试官此后的问题为当 offset到一定数量的时候怎么优化,因为之前没有遇到过类似的问题,而且也没有量特别大的分页,所以这个问题只能作罢。 复盘 回家后弄了个大概有快20W数据的表,实测一下,查询速度是否会因为 limit边大而边长。 如上图所示,同样的查询条件下,因为 limit增大查询速度确实变慢了很多。 why? 对于limit子句 LIMIT [offset,] row_count,官网说明如下 Theoffset specifies the offset of the first row to return. Theoffset of the first row is 0, not 1. Therow_count specifies the maximum number of rows to return. 翻译一下就是: offset参数指定要返回的第一行的偏移量。第一行的偏移量为0,而不是1。 ....

Go爬虫初体验

Go爬虫初体验

前言   闲来无事的时候,偶尔也会看看漫画,但是鹅厂的操作大家都懂,想看最新的你就得给钱,本着白嫖精神,我找到了扑飞漫画,但是这网页的阅读体验一言难尽,他家的APP也是,动不动就加载失败,一等一半天。思来想去,还是弄个爬虫把图片都爬下来,然后想法弄到kindle里面岂不美哉。因为不会Python,所以只好用GO来写了,虽然没写过,但是可以现学嘛。 初识爬虫   网上找了下资料,go的写爬虫也太简单了吧,几行代码就搞定了,比如下面这样,几行代码就把整个页面拿到了。 package main import ( "fmt" "io/ioutil" "net/http" ) func main() { resp, err := http.Get("https://www.baidu.html") if err != nil { fmt.Println("http get error", err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(....

Go面试总结

Go面试总结

面试是一个互相博弈的过程,此贴用于记录个人在面试中遇到的各种问题以及解答(不定期更新中) 面试是一个运气问题,你总会遇到一个面试官,问你的问题你都会,当然你会的越多,这个概率就越高

广州一年记

广州一年记

  随着房租和押金的缴纳,我定下了未来一年居住的房子,回头一看,来广州已经差不读一年有余。   一年的光阴辗转而逝,我从成都到了广州,从初入社会的应届生变成了一个初级社畜,从一无所有到有了那么一丢丢存款,我变了好多好多,又似乎啥也没变。   初到广州,城中村与高楼大厦组成的城市,让我感到无比陌生。在这个完全没有伙伴的城市,我感到孤独。开始了工作日两点一线,周末死宅在家的固定生活,就这样一年过去了。   在这一年里,我依稀记得我就出过一次门,那时元旦跨年夜,我决定出去走走,一个人看了电影,一个人吃了烧烤,一个人喝了小酒,那时我已习惯孤独,我开始学会享受孤独。在这样的环境下我开始自律,我开始习惯看书、写日记、记账、规划自己的道路...   我还是会整体每天没心没肺的嘻嘻哈哈,但是好像没有人再会和我一起欢笑,我的标志性的笑仿佛成了缓解尴尬的一种方式,我其实并不开心,但这又有什么关系,在这个常住人口一千万多人的城市,又有几个人关心或是在意你呢,收起自己的情绪,努力前进才是你该做的。   在这样环境下,我积压着大量的情绪无处发泄,太多太多的话无处倾述,身为话痨的我,也变得无话可说。偶尔与老友聊天....

Golang小技巧——不定时更新

Golang小技巧——不定时更新

1、函数返回值定义 一般的函数定义都是: func Test(a,b int) (int, int){} 然而go却可以这样: func Test(a, b int) (c,d int) {} 你可能觉得没什么,但是对于我这种懒人来说,这东西可太方便了,因为go没有 try...catch,所以所有的错误都需要自己手动抛出,一个函数里你可能有N个↓ if err != nil { return err } 实际中,你绝对不会只返回一个 err,可能还夹杂着各种乱七八糟的东西,写一次还好,写多了你真的不会烦吗?然而有了第二种定义方式,不过你又多少个返回值,只需要一个 return即可搞定, func (b buriedPoint) Retention() (channel, projectId, startTime, endTime string, list []dbmodel.BuriedPointKey, data []map[string]string, err error) { //... //return channel, projectId, startTime, en....

记一次蹭车事件

记一次蹭车事件

正文     清早起床,空气好好,骑着我扫来的哈喽,愉快的奔向公司。不巧的是遇到了人行道施工,我只好下车推着我的小自行车通过路障隔开的路段,由于是在机动车道,所以我小心翼翼,没走两步,好像有啥玩意倒了,两个路障一起倒了,砸向了一辆崭新的宝马,心里顿时咯噔一下,希望没蹭出啥毛病。   说时迟那时快,车主反映比我快多了,马上下册检查他的车辆,这次老天爷没站站我这把,门把手掉了点漆(如下图所示),当时我就慌了,这怕是2-300块钱又没了哦。把路障弄开后我诚恳的道歉并询问怎么办,车主随即表示,我这昨天才买的车,牌儿还没上呢,你这就给我弄掉漆了,这整个门都得重新喷漆,去4S店怎么也得千把块,你给我1000吧。当时就直接给我弄蒙了,满脑子嗡嗡的,怎么这么贵,宝马都这么牛批吗,今天是折在这儿了,这么多能不能不给。。。然后我就沉默了,他看我沉默,就问要不然报警,我一刚出社会没几天的程序员哪儿见过阵势啊,脑子依旧嗡嗡的,然后他就巴拉巴拉开始打电话,说的粤语我也听不懂,但是我开始清醒,此时,我的智商开始逐渐占领上风,我开始怀疑车把手掉漆是否要喷整个门,然后我开始在我的所谓的小圈子内寻找答案,并借助万能的搜....

高性能消息队列NSQ---GO--demo

高性能消息队列NSQ---GO--demo

前言   关于NSQ是什么,NSQ是做什么的,怎么启动,网上的资料太多太多,详情请移步分布式实时消息平台NSQ,里面讲的很详细,还附带demo。 客户端/生产者(producer)   NSQ发送消息非常简单,分两步完成: 创建Producer实例 调用Publish发送一个新的消息到指定的topic中 具体实现如下所示 func main(){ cfg := nsq.NewConfig() nsqd := "127.0.0.1:4150" producer, err := nsq.NewProducer(nsqd, cfg) if err != nil { log.Fatal(err) } if err := producer.Publish("test", []byte("Hello NSQ")); err != nil { log.Fatal("publish error:" + err.Error()) } } 服务端/消费者(consumer)   消费者用于接收指定topic中的消息,实现需分为3步: 调用NewConsumer为指定的主题/渠道创建消费者的新实例 ....

从零开始安装 solo 博客

从零开始安装 solo 博客

之前也写过类似的帖子,但是由于那时自己的各种原因写的不是特别好,所以今天写一个聚合帖,记录从购买服务器到安装solo然后通过nginx反向代理,最后升级https的全过程。此贴献给完全无基础的人,所以废话较多,见谅 1. 购买服务器 首先你得有自己的服务器,有的话就跳过。服务商可选的有很多,比如:阿里云、腾讯云、百度云、还有一些香港的服务商以及国外的(有特殊需求的可以考虑下)。腾讯和阿里对于新用户以及学生都有很大的优惠,配置的话如果只挂solo,买最低配1G1核1M即可。国内的几家都可以关注下,不定时会有很好的优惠活动。我比较推荐阿里云,前段时间刚买了一台3年才668多,不知道活动结束没有。阿里云购买服务器时会要求你安装系统(不知道可不可以不选),推荐选择centos。 2. 购买域名(可不买) 建议还是买一个域名,直接通过IP访问的话不是特别好。购买域名时不要盯着 .com,.cn这种比较热门的域名,往往很贵。还有尽量选择可备案的域名,否则就会像鼠鼠在碎觉一样只能挂载444端口上运行。可通过域名.信息查看可备案域名。如果你服务器买着国外的话似乎就不用备案。 3. 域名解析与备案 服务....

日刷leetcode--简单版系列(目录篇)

日刷leetcode--简单版系列(目录篇)

前言 谨以此贴记录我刷题的过程,那么我为啥要刷题呢 熟悉各互联网公司的算法题目,为找工作做准备。 复习以前学过的编程语言,LeetCode支持几乎所有主流编程语言,大家可以用不同语言来做题。 熟悉常见的算法和数据结构,LeetCode提供了交流平台,一些大神会将自己的解法贴出来共享,有些巧妙的解法实在令人叫绝,虽然几乎都是英文,但上面的国人也特别多(中文拼音名字>_<)。 学习别人的编程思维,加快编程的速度,避免常见的BUG。 以上内容摘抄自网络,纯属瞎说,真是的原因是: 因为上班工作做完后,不敢明目张胆的摸鱼 下班无聊不想打游戏 算法真的很弱 ...... 时过境迁,上次打开leetcode的时候还没有中文版,而现在已经有了--力扣。 由于篇幅的问题,我觉得5题一篇,话不多说。 目录: 日刷leetcode--简单版系列(一) 日刷leetcode--简单版系列(二) 日刷leetcode--简单版系列(三) 日刷leetcode--简单版系列(四) 日刷leetcode--简单版系列(五) 日刷leetcode--简单版系列(六)

日刷leetcode--简单版(一)

日刷leetcode--简单版(一)

返回总目录 日刷leetcode--简单版 1.两数之后 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解题思路 1 暴力法,双循环相加结果等于 target 就返回 示例代码 func twoSum(nums []int, target int) []int { for i := 0; i < len(nums); i++ { for j := i + 1; j < len(nums); j++ { if nums[i] + nums[j] ==target { return []int{i,j} } } } return nil } 运行结果 执行用时 :56 ms, 在所有 Go 提交中击败了 32.33%的用户 内存消....

日刷leetcode--简单版(二)

日刷leetcode--简单版(二)

返回总目录 日刷leetcode–简单版 26. 删除排序数组中的重复项 题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 你可以想象内部操作如下: // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums); // ....

日刷leetcode--简单版(六)

日刷leetcode--简单版(六)

返回总目录 日刷leetcode–简单版 167. 两数之和 II - 输入有序数组 题目描述 解题思路 定义双指针,分别在头部与尾部 判断两个的和是否与targent相等,相等级返回,比sum大则尾指针前移,反之头指针后移 示例代码 func twoSum(numbers []int, target int) []int { l, r := 0, len(numbers)-1 for l < r { sum := numbers[l] + numbers[r] if sum == target { return []int{l + 1, r + 1} } if sum < target { l++ } else { r-- } } return []int{-1, -1} } 运行结果 执行用时 :4 ms, 在所有 golang 提交中击败了97.30%的用户 内存消耗 :3 MB, 在所有 golang 提交中击败了68.38%的用户 168. Excel表列名称 题目描述: 解题思路 可以看做一个10进制转26进制问题,进制转换原理可查看->....

日刷leetcode--简单版(三)

日刷leetcode--简单版(三)

返回总目录 日刷leetcode–简单版 58. 最后一个单词的长度 题目描述 解题思路 定义一个变量统计,从前往后遍历,遇到空格归零就可以了,注意处理最后几个个字符全为空格的情况 定义一个变量统计,从后往前便利,虽然时间复杂度同为 O(n),但是第二个明显快很多 示例代码 func lengthOfLastWord(s string) int { var count int for i:= len(s)-1; i >= 0; i-- { if s[i] == 32{ if count == 0 { continue }else{ break } } count ++ } return count } 运行结果 执行用时 :0 ms, 在所有 Go 提交中击败了 100.00%的用户 内存消耗 :2.2 MB, 在所有 Go 提交中击败了 39.13%的用户 66.加一 题目描述 解题思路 从后面往前面循环,最后以一位加 1 即可,处理好末尾9与999 func plusOne(digits []int) []int { c := 1 // 定义一个变量用来进....

日刷leetcode--简单版(四)

日刷leetcode--简单版(四)

返回总目录 日刷leetcode–简单版 88. 合并两个有序数组 题目描述 解题思路 采用双指针,从前往后,如果nums2中当前值小于nums1中的值,这插入并后移 示例代码 func merge(nums1 []int, m int, nums2 []int, n int) []int { if n == 0 { return nums1 } i, j := 0, 0 for ; i < len(nums1) && j < n; i++ { if nums1[i] > nums2[j] { reverses(nums1[i:]) nums1[i] = nums2[j] j++ } else { continue } } for j < n { nums1[m+j] = nums2[j] j++ } return nums1 } func reverses(nums []int) { for i := len(nums) - 1; i > 0; i-- { nums[i] = nums[i-1] } } 运行结果 执行用时 :....

日刷leetcode--简单版(五)

日刷leetcode--简单版(五)

返回总目录 日刷leetcode–简单版 119. 杨辉三角 II 题目描述 解题思路 此题与118类似,直接冲118中返回最后一个数组即可,但是要优化到O(k)就显得不是那么容易了 公式: 简单的来说就是前面的数乘以一个分数,这个分数从左到右分别为n/1, (n-1)/2, ..., 2/(n-1), 1/n,比如第3行就是分别乘以3/1,2/2,1/3 这里要注意的是[1]是第0行,而非第一行 示例代码 func getRow(rowIndex int) []int { arr := make([]int,rowIndex+1) if rowIndex == 0{ return arr } arr[0] = 1 for i:= 1; i <= rowIndex; i++ { arr[i] = arr[i-1] * (rowIndex-i+1)/i } return arr } 运行结果 执行用时 :0 ms, 在所有 Go 提交中击败了100.00%的用户 内存消耗 :2 MB, 在所有 Go 提交中击败了90.24%的用户 121. 买卖股票的最佳时机 题目描....

凡打不倒我的,必使我强大!!!—— 墨殇的技术博客