一.操作环境

数据达到百w甚于更多的时候,我们的mysql查询将会变得比较慢, 如果再加上连表查询,程序可能会卡死。即使你设置了索引并在查询中使用到了索引,查询还是会慢。这时候你就要考虑怎么样来提高查询速度了。

抛弃其他的不讲,只从mysql本身的优化来讲,我所知道的方法有三种:mysql集群,mysql分表,mysql分区

二.mysql集群

mysql集群成本比较高,不过这不是这里讲的重点,后期开一篇文章,专门来讲这方面的知识。

三.mysql分表

1. 当数据达到百w,千w的时候,我们就想着怎么把表数据分流到不同的表中去,缩小单个表的体积,表的操作最后还是归根到对磁盘文件的操作,小文件的IO速度肯定要比大文件的速度要快。

2.分表的方式:分表有横向分表和纵向分表两种方式。

横向分表:指把表的数据分流要不同的表中去,比如100W的表数据分流到10个表中,每个表就只有10w条数据。

纵向分表:指的是拆分表的结构,比如把新闻的标题和新闻的内容拆开,放到不同的表中。这种方法主要是运用在前期的表开始设计阶段。

3. 着重讲一个横向分表的方法:

1):hash算法,就是通过一定的算法,得出一个值,再根据这个值知道去操作对应的表,比如我想分10个表,user1,user2,user3..........假设我们用uid来做为分表的计算字段,通过取余的方式来。某个用户的用户ID是5,5%10=5,那这个用户的数据就是放在user5这个表中。    这就是取余算法,当然还有其他的,具体根据实际业务的需求来定。

2):利用mysql本身的分表引擎merge

这种方式适合在设计表的时候考虑不周,已经出现大的数据,并查询缓慢的情况 。这种方式对程序代码的改动比较小,因为sql语句写好了,如果再采用第一种的分表方式的话,一个表拆分成多个表了,那程序代码对表的操作都要改。麻烦啊。

  1. mysql> CREATE TABLE IF NOT EXISTS `user1` (
  2. ->   `id` int(11) NOT NULL AUTO_INCREMENT,
  3. ->   `name` varchar(50) DEFAULT NULL,
  4. ->   `sex` int(1) NOT NULL DEFAULT '0',
  5. ->   PRIMARY KEY (`id`)
  6. -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  7. Query OK, 0 rows affected (0.05 sec)
  8. mysql> CREATE TABLE IF NOT EXISTS `user2` (
  9. ->   `id` int(11) NOT NULL AUTO_INCREMENT,
  10. ->   `name` varchar(50) DEFAULT NULL,
  11. ->   `sex` int(1) NOT NULL DEFAULT '0',
  12. ->   PRIMARY KEY (`id`)
  13. -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  14. Query OK, 0 rows affected (0.01 sec)
  15. mysql> INSERT INTO `user1` (`name`, `sex`) VALUES('张映', 0);
  16. Query OK, 1 row affected (0.00 sec)
  17. mysql> INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1);
  18. Query OK, 1 row affected (0.00 sec)
  19. mysql> CREATE TABLE IF NOT EXISTS `alluser` (
  20. ->   `id` int(11) NOT NULL AUTO_INCREMENT,
  21. ->   `name` varchar(50) DEFAULT NULL,
  22. ->   `sex` int(1) NOT NULL DEFAULT '0',
  23. ->   INDEX(id)
  24. -> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;
  25. Query OK, 0 rows affected, 1 warning (0.00 sec)
  26. mysql> select id,name,sex from alluser;
  27. +----+--------+-----+
  28. | id | name   | sex |
  29. +----+--------+-----+
  30. |  1 | 张映 |   0 |
  31. |  1 | tank   |   1 |
  32. +----+--------+-----+
  33. 2 rows in set (0.00 sec)
  34. mysql> INSERT INTO `alluser` (`name`, `sex`) VALUES('tank2', 0);
  35. Query OK, 1 row affected (0.00 sec)
  36. mysql> select id,name,sex from user2
  37. -> ;
  38. +----+-------+-----+
  39. | id | name  | sex |
  40. +----+-------+-----+
  41. |  1 | tank  |   1 |
  42. |  2 | tank2 |   0 |
  43. +----+-------+-----+
  44. 2 rows in set (0.00 sec)

a,如果你使用 alter table 来把 merge 表变为其它表类型,到底层表的映射就被丢失了。取而代之的,来自底层 myisam 表的行被复制到已更换的表中,该表随后被指定新类型。

b,网上看到一些说replace不起作用,我试了一下可以起作用的。晕一个先

c,一个 merge 表不能在整个表上维持 unique 约束。当你执行一个 insert,数据进入第一个或者最后一个 myisam 表(取决于 insert_method 选项的值)。mysql 确保唯一键值在那个 myisam 表里保持唯一,但不是跨集合里所有的表。

d,当你创建一个 merge 表之时,没有检查去确保底层表的存在以及有相同的机构。当 merge 表被使用之时,mysql 检查每个被映射的表的记录长度是否相等,但这并不十分可靠。如果你从不相似的 myisam 表创建一个 merge 表,你非常有可能撞见奇怪的问题。

3):第一种与第二种的比较,第一种的效率会比较高,但是第二种的扩展性会好一点。

四:表分区

当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引的方式来优化查询,由于索引本生的消耗以及大量的索引碎片的产生,查询的过程会导致大量的随机I/O的产生,在这种场景下除非可以很好的利用覆盖索引,否则由于在查询的过程中需要根据索引回数据表查询,会导致性能受到很大的影响,这时可以考虑通过分区表的策略来提高查询的性能

mysql 分表与分区的更多相关文章

  1. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  2. mysql分表,分区的区别和联系

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  3. Mysql分表和分区的区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  4. MYSQL分表与分区

    什么是分表分区分表分区的区别实现方式上数据处理上提高性能上实现的难易度上mysql分表和分区的联系如何分区概述分区技术支持分区类型及举例注意应用场景示例订单表比预想中扩张速度快坑爹的日志表每半月一个分 ...

  5. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  6. mysql分表和分区实际应用简介

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘 ...

  7. Mysql分表和分区的区别、分库和分表区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法. 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个 ...

  8. MySQL 分表和分区

    1.为什么需要分表和分区 在开发的过程中,经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,如果涉及联合查询的情况,性能更加 ...

  9. mysql分表和表分区详解

    为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能 ...

随机推荐

  1. JAVA Eclipse使用Maven构建web项目详解(SSM框架)

    tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...

  2. 解决HTML外部引用CSS文件不生效问题

    作为一个前端小白,鼓捣了几天前端..今天突然发现我深信不疑的东西,竟然出现了问题..就比如我在css目录下面写了一个css样式文档:style.css.这时里面只有一句话: body { backgr ...

  3. Dubbo框架应用之(三)--Zookeeper注册中心、管理控制台的安装及讲解

    我是在linux下使用dubbo-2.3.3以上版本的zookeeper注册中心客户端.Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心.Dubbo未对 ...

  4. Objective-C的继承与组合

    Objective-C的继承与组合 Objective-C与Java继承上的区别 区别 Objective-C Java 成员变量 Objective-C继承不允许子类和父类拥有相同名称的成员变量 J ...

  5. cassandra 3.x官方文档(2)---架构解析

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...

  6. 剑指Offer——联通研究院笔、面试题 (Offer已收割)

    剑指Offer--联通研究院笔.面试题 1.二叉树适宜存储什么样的数据? 树最适合用来表示( C ). A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 ...

  7. java.util.ServiceLoader使用

    近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到properties中,然后去程序读取,感觉这种方式不太灵活,于是,研究研究java中有没有 ...

  8. Python pygame安装过程笔记

    今天看到一个教程,是关于Python安装pygame模块的.觉得很好,拿来分享一下. 安装Python 额,这个小题貌似在这里很是多余啊.但是为了照顾到刚刚学习Python的童鞋,我还是多啰嗦两句吧. ...

  9. linux shell bash使用管道|和read结合时问题解决

    最近在将ksh转成bash运行的时候出现了问题.代码如下: echo $1 | sed 's/\..*$/''/' | read FILE_NAME 当使用ksh执行的时候没有问题,FILE_NAME ...

  10. Android初级教程:Android中解析方式之pull解析

    在安卓中有很多种解析方式.按照大方向有xml解析和json解析.而,细致的分,xml和json解析各有自己的很多解析方式.今天这一篇主要介绍xml解析中的pull解析.对于xml的解析方式,我之前在j ...