我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中怎么优化分表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中怎么优化分表

MySQL中怎么优化分表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1、试验PROCEDURE.
DELIMITER $$
DROP PROCEDURE `t_girl`.`sp_split_table`$$
CREATE  PROCEDURE `t_girl`.`sp_split_table`()
BEGIN
  declare done int default 0;
  declare v_user_name varchar(20) default ;
  declare v_table_name varchar(64) default ;
  -- Get all users name.
  declare cur1 cursor for select user_name from t_group group by user_name;
  -- Deal with error or warnings.
  declare continue handler for 1329 set done = 1;
  -- Open cursor.
  open cur1;
  while done <> 1
  do
    fetch cur1 into v_user_name;
    if not done then
      -- Get table name.
      set v_table_name = concat(t_group_,v_user_name);
      -- Create new extra table.
      set @stmt = concat(create table ,v_table_name, like t_group);
      prepare s1 from @stmt;
      execute s1;
      drop prepare s1;
      -- Load data into it.
      set @stmt = concat(insert into ,v_table_name, select * from t_group where user_name = ,v_user_name,);
      prepare s1 from @stmt;
      execute s1;
      drop prepare s1;
    end if;
  end while;
  -- Close cursor.
  close cur1;
  -- Free variable from memory.
  set @stmt = NULL;
END$$

DELIMITER ;

2、试验表。
我们用一个有一千万条记录的表来做测试。

> select count(*) from t_group;
+----------+
| count(*) |
+----------+
| 10388608 |
+----------+
1 row in set (0.00 sec)

表结构。
mysql> desc t_group;
+-------------+------------------+------+-----+-------------------+----------------+
| Field       | Type             | Null | Key | Default           | Extra          |
+-------------+------------------+------+-----+-------------------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL              | auto_increment |
| money       | decimal(10,2)    | NO   |     |                   |                |
| user_name   | varchar(20)      | NO   | MUL |                   |                |
| create_time | timestamp        | NO   |     | CURRENT_TIMESTAMP |                |
+-------------+------------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)

索引情况。

mysql> show index from t_group;
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
|Table   | Non_unique | Key_name         | Seq_in_index | Column_name |Collation | Cardinality | Sub_part | Packed | Null | Index_type |Comment |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
|t_group |          0 | PRIMARY          |            1 | id          |A         |    10388608 |     NULL | NULL   |      | BTREE     |         |
| t_group |          1 | idx_user_name    |           1 | user_name   | A         |           8 |     NULL | NULL   |      |BTREE      |         |
| t_group |          1 | idx_combination1|            1 | user_name   | A         |           8 |     NULL |NULL   |      | BTREE      |         |
| t_group |          1 |idx_combination1 |            2 | money       | A         |        3776|     NULL | NULL   |      | BTREE      |         |
+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
4 rows in set (0.00 sec)

PS:
idx_combination1 这个索引是必须的,因为要对user_name来GROUP BY。此时属于松散索引扫描!当然完了后你可以干掉她。
idx_user_name 这个索引是为了加快单独执行constant这种类型的查询。
我们要根据用户名来分表。

mysql> select user_name from t_group where 1 group by user_name;
+-----------+
| user_name |
+-----------+
| david     |
| leo       |
| livia     |
| lucy      |
| sarah     |
| simon     |
| sony      |
| sunny     |
+-----------+
8 rows in set (0.00 sec)

所以结果表应该是这样的。
mysql> show tables like t_group_%;
+------------------------------+
| Tables_in_t_girl (t_group_%) |
+------------------------------+
| t_group_david                |
| t_group_leo                  |
| t_group_livia                |
| t_group_lucy                 |
| t_group_sarah                |
| t_group_simon  &n

关于MySQL中怎么优化分表问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中怎么优化分表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL中怎么优化千万级数据表

MySQL中怎么优化千万级数据表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我这里有张表,数据有1000w,目前只有一个主键索引CREATE TABLE `u
2023-06-20

MySQL优化(6):分表和读写分离

分表通常指:通过应用程序层,将数据划分到不同的表中进行存储对比分区,分区是在服务器层完成的分区算法分表会导致客户端明显的改变,在服务器端出现结构相同的多张表,甚至可以把多张表分到不同的服务器上 以账单表为例:数据库可能会有这样的情况create table b
MySQL优化(6):分表和读写分离
2019-09-15

故障分析 | MySQL 派生表优化

一、问题 SQL原 SQL 如下:select name,count(name) from bm_id a left JOIN(select TaskName from up_pro_accept_v3_bdc union all select TaskNam
故障分析 | MySQL 派生表优化
2014-08-06

Mysql千万级别水平分表优化

需求:随着数据量的增加单表已经不能很好的支持业务,千万级别数据查询缓慢   Mysql数据优化方案:   方案一:使用myisam进行水平分表优化   方案二:使用mysql分区优化   一:Myisam水平分区   1、创建水平分表 user_1:   --
Mysql千万级别水平分表优化
2016-01-31

如何优化MySQL表?

优化 MySQL 表是提高数据库性能和效率的关键一步。通过采用有效的优化技术,您可以提高查询执行速度、降低存储要求并优化资源利用率。本文探讨了优化 MySQL 表的各种策略和最佳实践,使您能够最大限度地提高数据库驱动的应用程序的性能。在本
2023-10-22

mysql中如何优化表释放表空间

这篇文章主要介绍了mysql中如何优化表释放表空间问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-18

怎么优化MySQL

本篇内容主要讲解“怎么优化MySQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么优化MySQL”吧!1、EXPLAIN做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。2、
2023-06-04

Mysql深度分页搜索怎么优化

要优化MySQL深度分页搜索,可以考虑以下几种方法:使用索引:确保搜索的字段上有适当的索引。对于深度分页搜索,较大的表可能需要创建复合索引,以提高查询性能。限制返回的列:只选择需要的列,而不是返回整行数据。这可以减少数据传输量,提高查询速度
Mysql深度分页搜索怎么优化
2023-10-28

编程热搜

目录