摘要

最近遇到一个慢sql,在排查过程中发现和分库分表后的索引设置有关系,总结了下问题。

问题

在进行应用健康度盘点时,发现有个慢sql

如下

select brandgoodid from brandgood_0020

where userid = xxx AND

brandgoodid in("xxx1","xxx2")

表结构,按照userid进行的分表。

CREATE TABLE`brandgood_0020` (

`brandgoodid` char(30) NOT NULL COMMENT ,

`user_id` int(10) unsigned DEFAULT NULL COMMENT '用户id',

`created` timestamp NULL DEFAULT CURRENT_TIMESTAMP,

`last_modified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

`deleted` bit(1) NOT NULL DEFAULT b'0',

PRIMARY KEY (`brandgoodid`),

KEY `idx_userid` (`userid`) USING BTREE,

) ENGINE=InnoDB DEFAULT CHARSET=utf8

explain一下发现走的是userid这个索引,一个用户下面有很多商品,也就有了很多brandgoodid,所以有可能会很慢,因为要扫描很多的索引键去过滤brandgoodid值。

而写这个SQL的人期望走的主键索引,而不是'userid'的索引。因为用主键索引,就是N次主键扫描(N表示in中的数量)。

分析

直接原因很明显

IN 这个查询误导了mysql的优化器,选错了索引

IN 查询常常会影响mysql server的判断。主要是IN里面的值数量不同,会影响扫描行数的不同,所以常常会出现索引选择不一致。之前也总结过一篇SQL IN 一定走索引吗

解决

因为用户查询的brandgoodlid是限定在某个group维度下的,一个group对应的brandgood是有限的,在这个业务中,通常小于10。所以这个地方使用主键索引,效率更高。解决方法也就是这地方需要force index强制走PRIMARY index。

扩展

分库分表后的索引

为什么题目叫分库分表后的索引问题的,直接原因和分库分表并没有什么关系啊?

因为在排查问题时,犯了一个错误。以为路由到具体的brandgood_0020表后,可以直接根据brandgoodid主键索引来查询了。认为和一些分布式数据库(cassandra)一样,是clustering key+partition key这种索引数据。可以根据clustering key到数据的节点的partition块,然后根据local index 找到对应的数据。

但其实mysql的分库分表不一样,分表键不是索引,只是客户端路由。只负责找到对应的表。到表以后,就是和单表一样查询逻辑。

因为分表键不是索引,但是查询语句是必须要带着分表键,那意味着我们的分库分表以后的表索引大部分要建成联合索引了,分表键+索引键。

要不然我们的查询语句 select xx from table where 分表键=xxx AND a =xxx,是走不了联合索引的。只能走单索引。单索引mysql server要面临着索引选择的问题。

当然并不是绝对的,比如上面我举的那个案例。按照这个思路查看了下其他的分表索引。果然表上的大部分索引都是非联合索引,还是直接从单表copy过来的索引。这些索引基本上都是无用的,因为都的是userid索引.

索引选择的问题

我们这个案例是因为判断扫描行数的时候出问题了。

mysql分表后怎么索引_分库分表后的索引问题相关推荐

  1. mysql 分表 好处_分库分表浅谈

    什么是分库分表 ​顾名思义,分库分表就是按照一定的规则,对原有的数据库和表进行拆分,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上. 为什么需要分库分表 ​随着 ...

  2. MySQL分库分表会带来哪些问题?分库分表问题

    MySQL分库分表会带来哪些问题? 分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO.硬件资源.连接数的瓶颈,同时也带来了一些问题.下面将描述这些技术挑战以及对应的解决思路. 分库分表 ...

  3. 分库分表之_分库分表 + 复杂查询

    前言 Github:https://github.com/HealerJean 博客:http://blog.healerjean.com 代码配置暂时和和分库分表之_分库分表相同.但是为了测试下面的 ...

  4. mysql 横向分表合并_MySQL横向扩展-分库分表解决方案总结

    从业务场景看分库分表 互联网行业中,业务场景通常写少读多的情况居多,在MySQL的使用前期,读性能大多可以通过SQL优化来解决,但随着业务的持续发展,单纯依靠SQL的查询优化会越来越难以达到业务服务要 ...

  5. java hash 分库分表_分库分表方案

    摘自:Java技术栈 一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值. 在业务Service来看就是,可用数据库连接少 ...

  6. 数据库查询某一列大写转化小写字母表示_基于MySQL数据库下亿级数据的分库分表...

    每天给你诚意满满的干货 本文来自程序之心知乎专栏收到的投稿 作者:恒生研究院 移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据等这样的分析,都需要依靠数据统计和分析,当数据量小时,数据库方 ...

  7. mysql分表插件_分库分表简单?那我想问如何实现“分库分表插件”?

    随着系统数据量的日益增长,在说起数据库架构和数据库优化的时候,我们难免会常常听到分库分表这样的名词. 当然,分库分表有很多的方法论,比如垂直拆分.水平拆分:也有很多的中间件产品,比如MyCat.Sha ...

  8. mysql分库分表分页查询语句_MySQL分库分表分库后的查询(8th)

    前言 这边我们以使用python程序要展示一下再分库分表后,我们需要如何对数据库进行操作. python操作数据库 我们这边还是沿用之前的那5中:场景1:购买者下订单#!/usr/bin/env py ...

  9. mysql 分表后排序_MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?...

    昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>. ...

最新文章

  1. mysql主键自增长空缺_Mysql 主键自增长auto_increment问题分析
  2. SAP MM 销售订单库存与普通库存之间相互转换过账后对于EBEWH以及MBEWH表的更新...
  3. Mac 建PHP 环境 及 配置 apache 默认目录
  4. swift 如何实现点击view后显示灰色背景
  5. 数人云CEO王璞:容器正成为软件交付的标准
  6. linux 进程间读写锁,Linux系统编程—进程间同步
  7. python百度翻译爬虫_Python爬虫教程-05-python爬虫实现百度翻译
  8. Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)
  9. Oracle10怎样调出左侧的表,excel2010菜单栏不见了!怎样在excel左侧显示导航
  10. oracle安装总结
  11. 使用bootstrap建立响应式网页——头部导航栏
  12. 复制pdf文本出现大量换行的解决办法
  13. 2-思科防火墙:思科ASDM
  14. LintCode 148. 颜色分类 JavaScript算法
  15. Matlab给二维函数图像标注极值点
  16. mysql 删除数据后myd_关于mysql 删除数据后(.MYD,MYI)物理空间未释放
  17. Mac电脑音质提示音效调节软件:Boom 3D
  18. html设置图片为部分背景颜色,设置HTML的一个部分作为一个不同的背景颜色
  19. Python学习笔记哈哈哈
  20. iOS开发中SDK是什么?

热门文章

  1. 【PAT乙级】1056 组合数的和 (15 分)
  2. 用C语言输出一个字符串的所有子串
  3. FastDFS工具类的使用
  4. Oracle的DECODE函数
  5. jQuery拼接页面元素
  6. MySQL添加、删除字段
  7. 打开aspx现有实例
  8. 链表中环的入口结点 python_链表中环的入口结点
  9. python测试网络连通性_python 判断网络连通的实现方法
  10. Spring事务的那些坑,这里都给你总结好了!