一.操作环境

数据达到百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. Matplotlib Toolkits:python高级绘图库seaborn

    http://blog.csdn.net/pipisorry/article/details/49515745 Seaborn介绍 seaborn (Not distributed with matp ...

  2. 剑指Offer——“你最大的缺点是什么”回答技巧及范例

    剑指Offer--"你最大的缺点是什么"回答技巧及范例   问题分析:认识自己的缺点是一个巨大的优点, 当HR问到你缺点的时候, 你的机会来了, 请快展示你的自知之明吧!你想把优点 ...

  3. 关于[[NSNotificationCenter defaultCenter] addObserver不remove后续又收到通知crash问题

    今天试了一个小demo,测出一个现象,同步出来:object 作为 observer 监听了通知 A,然后 object 中途被释放执行了dealloc,随后app发出这个通知 A:iOS 6.iOS ...

  4. JAVA面向对象-----instanceof 关键字

    instanceof 关键字 1:快速演示instanceof Person p=new Person(); System.out.println( p instanceof Person); 2:i ...

  5. MPI二维笛卡尔坐标划分【1】

    本文简单演示,如何对现有进程进行二维划分,如何获得进程的X和Y坐标. 只有一段程序: #include <mpi.h> #include <stdio.h> #include ...

  6. 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)

    ===================================================== 最简单的基于FFmpeg的libswscale的示例系列文章列表: 最简单的基于FFmpeg ...

  7. SSH深度历险(四) Maven初步学习

    这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理 ...

  8. React Native项目组织结构介绍

    代码组织: 目录结构: . ├── components //组成应用的各个组件 │   ├── Routers.android.js //每个组件若实现不一样,分为android的实现和ios的实现 ...

  9. Mybatis执行SimpleExecutor(三)

    SimpleExecutor通过类名可以看出,它是一个简单的执行类,并不会做一些处理就执行sql,源码及分析如下: /** * @author Clinton Begin */ public clas ...

  10. 【一天一道LeetCode】#89. Gray Code

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 The gra ...