各位大佬好,我是一个 rails 新手,最近遇到了一点问题:
某一条 sql 在线上环境中有一定概率 (5% 左右) 出现较长的执行时间,而线下环境无法复现。
初步怀疑是innodb_buffer_size太小导致,同时查看了cache,发现命中情况并不理想,也怀疑存在 cache lock 有影响。接下来准备调整参数。
如果想看看具体是哪里慢了,我想到的办法是把过去的 N(15 <= N <= 100) 条 profile 都记录出来,然后 parse 出最近的几条(需要的 sql)query id,然后执行 show profile for query xxx;
存在的疑惑:
profile 的打开与否似乎是 session 级别的(不确定,但是实验现象表面如此),那么我需要每次都在需要定位的模块开头 set profile = 1,然后才能执行下面的操作吗?
我的线上环境是 多进程 + 多线程,那么每一个线程拿到的 connecrtion 是不是只记录了对应的 sql 呢?这样无论多高的并发,我都可以拿到最近执行的 sql profile 情况而不用担心
被其他 sql 冲走。