一.操作环境

数据达到百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. Mac入门

    Mac入门 桌面 windows桌面有图标罗列 Mac桌面有Dock 菜单栏 感觉上和Windows系统的底部菜单栏有点像,但是却略有不同,Mac的菜单栏默认在顶部 左侧的一些功能是固定不变的,跟随当 ...

  2. Android Multimedia框架总结(二十一)MediaCodec中创建到start过程(到jni部分)

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53386117 我最近正在参加CS ...

  3. 将Gradle项目发布到Jcenter和Maven Central

    Jcenter和Maven Central 为了方便我们理解Android studio是如何帮助我们获取开源库的,我们需要理清几个概念.Apache Maven是Apache开发的一个工具,提供了用 ...

  4. Python Tkinter小试

    前两天看到一篇关于Python使用Tkinter 的博文,写的很好.就拿来研究了一下,改了改.现分享如下: 参考 代码 # coding:utf8 # python2.73 winxp ''''' 天 ...

  5. Web自动化框架LazyUI使用手册(8)--excel数据驱动详解(ExcelDataProvider)

    概述 框架提供了excel数据驱动方式运行测试用例的工具,本文将针对数据驱动,进行详细演示. 详见类:lazy.test.ui.browser.ExcelDataProvider 被测对象: http ...

  6. Android倒计时器——CountDownTimer

    Android倒计时器--CountDownTimer 说明 第一个参数是倒计时的时间 第二个参数是多长时间执行一次回调 /** * @param millisInFuture The number ...

  7. [Matlab]技巧笔记

    1.将字符串作为Matlab命令执行 md = 'dir'; eval(md); 2.将字符串作为系统命令执行 md = 'dir'; system(md); 3.使显示图像的坐标轴使用相同的度量单位 ...

  8. Android简易实战教程--第二十话《通过广播接收者,对拨打电话外加ip号》

    没睡着觉,起来更篇文章吧哈哈!首先祝贺李宗伟击败我丹,虽然我是支持我丹的,但是他也不容易哈哈,值得尊敬的人!切入正题:这一篇来介绍个自定义广播接收者. 通常我们在外拨电话的时候,一般为使用网络电话.如 ...

  9. 带你深入理解STL之List容器

    上一篇博客中介绍的vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,很好的支持了随机存取,但由于是连续空间,所以在中间进行插入.删除等操作时都造成了内存块的拷贝和移动,另外在内存空间 ...

  10. 使用Geolocation校正GDAL不支持的数据

    对于低分数据来说,常用的校正方式就是给定数据的经纬度查找表来进行校正.在GDAL中,这种校正方式叫Geolocation array.常用的数据有国外的MODIS数据,国内的如风云系列(FY)和海洋系 ...