微盟面试:为什么一条SQL语句执行很慢?

      笔者在之前的一次面试经历中,被面试官问到这一问题,当时答得不是很好,后来也查看了很多资料,今天做一个详细的总结。

      在我们的日常开发中,肯定或多或少的遇到过 SQL 语句查询慢的问题,遇到这种问题无非就两种情况:一、大部分情况下都是执行的很快,偶尔需要很长时间。二、SQL 语句一直都执行得很慢。接下来将对这两种情况进行详细分析。

一、偶尔执行很慢

      大部分情况下执行都是正常得,部分时间执行很慢,首先可能确认 SQL 语句本身是没有多大的问题的,那是什么原因呢?

1、数据库在刷新脏页

      脏页 是指当内存中的数据页和磁盘数据页中的不一致时,我们把内存数据页称作“脏页”;否则称之为“干净页”。
      当我们对数据库进行更新操作(增、删、改等)时,数据库首先会在内存中对数据进行更新,但这并不会直接同步到磁盘中,而是把这些更新的记录写道 redo log 日志中去,然后等系统空闲时再写到磁盘中。

刷新脏页的情况:

  • redo log写满了,和其他容器一样,redo log 的容量也是有限的,当我们一直对数据库进行操作,redo log 很快就会被写满,这时数据库就不能等到系统空闲时刷新脏页了,就只能暂停其他操作,尽快把数据同步到磁盘当中,因此,有时候我们的 SQL 语句执行的会比较慢的情况
  • 内存不够用了,上面介绍了,数据库会在内存中进行操作,当我们一次性查询很多数据,而这些数据都不在内存当中,更可恶的是此时的内存不够用了,这时候就需要释放一部分内存数据页,如果这些数据页都是脏页,那么将刷新脏页;如果是干净页的话直接释放就好了。
  • MySQL 认为系统空闲,这时候就会刷新脏页了。
  • MySQL 正常关闭,当数据库关闭的时候,会把脏页刷新到磁盘中,在下一次启动时,直接从磁盘中读取数据。

2、拿不到锁

      这个应该很好理解吧,数据库有各种锁,当我们执行一条语句的时候,可能会需要某种锁,但此时有其他用户在使用这个锁,那很无奈啊,只能等别人用完释放锁了。

二、一直执行很慢

      在数据量一定的情况下,如果你的 SQL 语句执行的很慢,你就要好好想想你的 SQL 语句了。
      首先我们建如下的表,为后续的说明打基础。

CREATE TABLE `test` (
        `id` int(11) NOT NULL,
        `c` int(11) DEFAULT NULL,
        `d` int(11) DEFAULT NULL,
         PRIMARY KEY(`id`)
) ENGINE = InnoDB;

1、没有用到索引

 SELECT * FROM `test` WHERE `c` < 10000;
 SELECT * FROM `test` WHERE `id`-1 = 100;

      以上的这两种情况都不会用到索引,第一个是因为字段c本身没有索引,第二是在索引列做了运算操作。至于其他的一些会造成索引失效的情况,在这里就不详细介绍了。因为接下来的内容才是重点

2、数据库自己选错了索引

      数据库在执行语句的时候,会进行一个预测:走索引扫描的行数少还是直接全表扫描的行数少?扫描行数越少也好,扫描行数越少,I/O操作的次数也就越少。
      主键索引存放的值是整行字段的数据,而非主键索引上存放的值不是整段的数据,而是主键字段的值。如果查询走非主键字段,会先查询对应主键的值,然后再走一遍主键索引,然后查询到整行数据。

系统怎么预测判断呢?

      系统是通过索引的\color{#FF3030}{区分度}来判断的,一个索引上不同的值越多,意味着出现相同数值的索引越少,意味着索引的区分度越高。我们也把区分度称之为 基数 ,即 区分度越高,基数越大

      系统怎么获取这个索引的基数呢? 通过采样的办法,遍历部分数据。采样的方式可能会出现失误,一个索引的基数实际上可能很大,但在采样的过程中,很不幸,数据库遍历了那份基数很小的。然后就直接全表扫描了。
 
 


      未完,待续!


 
 
 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342