`
bugyun
  • 浏览: 551570 次
社区版块
存档分类
最新评论

分库分表SQL优化

 
阅读更多
分库拆表:
好处:
1. 数据库容量问题;
2. 解决性能压力的最优选择;
原则:
反范式数据结构设计,所谓反范式,第一要点是不用外键,不允许Join 操作,不允许任何需要跨越两个表的查询请求;第二要点是适度冗余减少查询请求。
 
分库方案:
1. 安全性拆分
将高安全性数据与低安全性数据分库,这样的好处第一是便于维护,第二是 高安全性数据的数据库参数配置可以以安全优先,而低安全性数据的参数配置以性能优先。
2. 基于业务逻辑拆分
基于业务逻辑拆分,可以减少前端应用请求发送到不同数据库服务器的频次,从而减少链接开销,便于日常维护和前端调用;
3. 基于负载压力拆分
基于负载压力对数据结构拆分,便于直接将负载分担给不同的服务器。
基于负载压力拆分,可能拆分后的数据库包含不同业务类型的数据表,日常 维护会有一定的烦恼
 
分表:
数据量过大或者访问压力过大的数据表需要切分
忙闲分表
单数据表字段过多,可将频繁更新的整数数据与非频繁更新的字符串数据切分
横向切表
a. 等分切表,如哈希切表或其他基于对某数字取余的切表。等分切表的优点是 负载很方便的分布到不同服务器;缺点是当容量继续增加时无法方便的扩容, 需要重新进行数据的切分或转表。而且一些关键主键不易处理。
b. 递增切表,比如每 1kw 用户开一个新表,优点是可以适应数据的自增趋势; 缺点是往往新数据负载高,压力分配不平均。
c. 日期切表,适用于日志记录式数据,优缺点等同于递增切表。
热点数据分表
将数据量较大的数据表中将读写频繁的数据抽取出来,形成热点数据表。通常一个庞大数据表经常被读写的内容往往具有一定的集中性,如果这些集中数据单独处理,就会极大减少整体系统的负载。
热点数据表与旧有数据关系:
a. 可以是一张冗余表,即该表数据丢失不会妨碍使用,因源数据仍存在于 旧有结构中。优点是安全性高,维护方便,缺点是写压力不能分担,仍 需要同步写回原系统。
b. 可以是非冗余表,即热点数据的内容原有结构不再保存,优点是读写效 率全部优化;缺点是当热点数据发生变化时,维护量较大。
c. 具体方案选择需要根据读写比例决定,在读频率远高于写频率情况下,优先考虑冗余表方案。
 
主从架构:
1. 读写分离对负载的减轻远远不如分库分表来的直接;
2. 写压力会传递给从表,只读从库一样有写压力,一样会产生读写锁!
3. 主从延迟也是重大问题。一旦有较大写入问题,如表结构更新,主从会产生巨大 延迟。
 
mysql优化:
建索引的原则:
1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式
3.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录
4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);
5.尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
 
慢查询优化步骤:
1. 先从单个表where条件后,返回记录数最小的表查起;
2. order by limit 形式的sql语句让排序的表优先查;
3. explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询);
4. 根据建索引的原则,添加索引
分享到:
评论

相关推荐

    读书笔记:高性能MySQL之路涉及MySQL高级部分知识分库分表SQL优化等内容.zip

    读书笔记:高性能MySQL之路涉及MySQL高级部分知识分库分表SQL优化等内容

    分库分表自动建库表小工具

    在IT行业中,数据库管理是至关重要的,特别是在大数据量的情况下,分库分表是一种常见的优化策略。这个名为"分库分表自动建库表小工具"的程序正为此目的而设计,它能帮助开发者自动化地创建分布式数据库架构。下面将...

    MySQL 分库分表的实现原理及演示案例

    这些中间件能够屏蔽分库分表的复杂性,提供统一的SQL接口给上层应用使用,同时处理好数据分布、路由、事务、容错等复杂问题。常见的中间件有ShardingSphere、MyCAT等。 在进行分库分表时,开发者和数据库管理员需要...

    spring动态数据源+mybatis分库分表

    在现代企业级应用中,随着数据量的增长,单表存储可能会遇到性能瓶颈,这时就需要引入分库分表的策略来优化数据库的性能。"spring动态数据源+mybatis分库分表"是一个针对大型数据库场景的解决方案,它利用Spring框架...

    分库分表总结

    为了解决这一问题,"分库分表"成为了一种常见的优化策略。本文将深入探讨分库分表的概念、原理以及实际应用中的注意事项。 一、分库分表简介 分库分表,顾名思义,就是将一个大的数据库分解为多个较小的数据库或表...

    分库分表-zdal

    ##### 2.5 分库分表SQL执行流程 当执行SQL时,流程如下: - SQL接收与解析 - 根据规则引擎确定目标库 - 执行SQL - 结果集的合并与返回 #### 三、关键技术及第三方框架依赖 ##### 3.1.1 Zdal-client - **加载...

    sharding + mybatis-plus 分库分表

    "Sharding + Mybatis-Plus 分库分表"的主题就是针对这个问题提出的解决方案。Sharding-JDBC是一个轻量级的Java框架,它可以在不改变任何数据库语义和业务代码的情况下,实现数据库的水平拆分,从而提高系统的并行...

    47_来来来!咱们聊一下你们公司是怎么玩儿分库分表的?.zip

    开发者可以通过配置文件或编程接口指定分库分表规则,ShardingSphere会自动处理SQL路由和结果集合并。 4. **挑战与应对**:分库分表带来的挑战包括跨库事务一致性、分布式主键生成、数据迁移以及查询复杂度增加等。...

    基于Java的BigSQL分库分表中间件.zip

    基于Java的BigSQL分库分表中间件 项目简介 BigSQL是一个基于Java的分库分表中间件,旨在简化MySQL数据库的分库分表操作。它实现了MySQL服务器协议,支持任何语言和客户端工具(如MySQL图形化工具、Navicat等)的...

    mycat 分库分表

    **mycat 分库分表详解** mycat 是一个开源的分布式数据库中间件,它能够将一个大型数据库逻辑上划分为多个小型数据库,实现数据的分布式存储,以解决单机数据库在高并发、大数据量场景下的性能瓶颈问题。mycat 在 ...

    分库分表,多数据源的切换

    例如,我们可以根据业务模块或者用户ID进行分库分表,然后在需要执行SQL的地方,Sharding-JDBC会自动将SQL解析并路由到正确的数据库和表。 通过SSMDemo这个示例项目,我们可以深入了解Sharding-JDBC的使用方法。该...

    Spring MVC +Spring + Mybatis 构建分库分表源码

    同时,使用Mybatis的Mapper接口和XML配置文件,可以方便地编写分库分表的SQL语句。对于分表,可以在Mapper中定义多个方法,每个方法对应一个表,通过动态SQL来实现不同表的操作。 在实际应用中,为了简化分库分表的...

    Mysql优化、MyCat搭建、分库分表、读写分离、负载均衡

    MySQL优化是数据库管理中的关键环节,它涉及到性能提升、资源有效利用和系统...以上就是关于"Mysql优化、MyCat搭建、分库分表、读写分离、负载均衡"的相关知识点,这些内容对于管理和优化大型MySQL数据库系统至关重要。

    java + spring boot +jpa 拦截器分库分表demo

    而当项目发展到一定规模,数据库的扩展性和性能优化就显得尤为重要,分库分表技术应运而生。本Demo主要展示了如何结合Java、Spring Boot以及JPA实现一个分库分表的解决方案。 首先,我们要理解什么是JPA(Java ...

    java分库分表源码

    Java 分库分表是一种在大数据量场景下优化数据库性能的技术,它通过将单一的大表分成多个小表,分散存储在不同的数据库中,从而降低单表数据量,提高查询效率,减轻数据库的压力。在这个"java分库分表源码"项目中,...

    MySQL 分库分表的实现原理及演示案例.zip

    MySQL数据库在面临大数据量时,性能可能会显著下降,此时就需要采用分库分表的技术来解决这一问题。分库分表是数据库水平扩展的一种常见策略,它通过将数据分散到多个数据库或表中,来减轻单个数据库的压力,提高...

    Mybatis分库分表扩展插件

    3. **查询优化**:分库分表可能导致部分查询无法使用索引,需要关注SQL性能并进行优化。 4. **分布式ID生成**:为了保证全局唯一性,需要使用分布式ID生成策略,如Snowflake算法。 总的来说,Mybatis分库分表插件...

    数据库分库分表

    例如,`common-db-route`可能是一个通用的数据库路由模块,它负责根据业务逻辑和分库分表策略,将SQL语句路由到正确的数据库和表上。`db-route-demo`可能是这个路由机制的示例代码,展示了如何在实际项目中实现数据...

    SpringCobar分库分表

    Cobar是一个高性能的MySQL代理服务器,它支持读写分离、分库分表、SQL路由等功能,是分布式数据库系统的重要组成部分。通过SpringCobar,我们可以方便地在SpringMVC框架中集成Cobar,实现对数据库操作的透明化管理。...

Global site tag (gtag.js) - Google Analytics