如何在mysql中使用分区表提高查询效率

粗略地说,利用MySQL分区表提高效率的本质就是对数据进行“精准攻击”:让查询只看需要看的分区,而不是一一扫描分区。
这背后有两件事:必须正确选择分区策略以及键和分区索引必须良好匹配。

我们先来说说最重要的事情。
去年我们分析了一个价值千万的订单表,直接除以RANGE时间。
结果,查询“2 02 3 年 5 月的销售额”从 5 秒增加到 0.2 秒。
还有一点是,KEY部分特别适合用户ID数据量极大的场景。
我们通过HASH(id)将其分为4 个块,然后创建联合索引(idx_time_content),查询时间减半。
还有一个更重要的细节。
例如,如果您使用RANGE分区,则分区条件必须硬编码在WHERE中,否则MySQL根本不会执行分区修剪。
老实说,这是一个真正的陷阱,很多人都被困在这里。

一开始我以为章节越多越好,但后来我发现这是错误的。
去年,表空间陷入危机,分区数量增加到2 00多个,管理成本翻倍。
等等,还有别的事。
主键不能被意外添加。
要创建唯一索引,必须包含分区键。
很多人没有注意到这一点。

建议先用少量数据运行一下,看看选择哪一列作为分区键,然后使用EXPLAIN查看执行计划。
几千米固然不错,但如果分区管理不正确,仍然可能导致系统崩溃。

mysql分区怎么设置

你说的这个部分是我以前在电商公司做的。
当时每天的数据量有几十万。
当时我们整个运维团队都发脾气了,因为表太大,查询总是慢。

然后老板听了顾问的建议,把很多大桌子分成了几个部分,效果确实不错。
我会告诉你我走过的峡谷,那些都是真实的事情。

我们来谈谈时机。
我们有一个按月划分的订单计划。
一开始,选择订单创建时间作为段键。
结果呢?每次月底都会清空数据。
您必须运行脚本来删除旧分区。
我曾经在半夜写过,不小心提前删除了。
第二天,外科维修主任险些丧命。
因此,选择分区键不是问题,但要注意不要破坏数据。
去年冬天,我们运行了一个 cron 作业来自动清理分区。
经过一夜的努力,三个月前,数据就清晰地找到了。
当时我的手心都出汗了。
关于哈希分区我们来谈谈吧。
我们有大量的数据和查询速度慢的用户行为表。
当时我想让hash分区更加均匀。
结果呢?数据分布不均匀。
有些分区的数据较多,有些分区的数据较少。
查询还是很慢。
后来我发现一定要根据数据的特点来选择分区方法。
去年春天,我们转向按行为类型进行细分。
效果立竿见影,查询速度至少快一倍。

此外,分区表中不能添加外键。
这个洞我已经进过很多次了。
我记得在分区表中添加外键来连接另一个表,但是直接报错。
当时我以为是我的SQL写的有问题,所以纠结了好久才搞清楚分区表的限制,查了手册。
因此,在设计分区表时,必须提前考虑对应的表。
两年前,我们通过将大型非分区表划分为分区表来重建旧系统。
结果因为外交事务整个迁移计划必须改变,并且必须投入大量精力。

总的来说,Segmentation是个好东西,但必须用在正确的地方。
不要为了分裂而分裂;这实际上取决于您的业务需要的情况。
例如,在您的电子商务公司;按时间或用户ID范围将订单表和用户表分开,确实可以提高效率。
但如果您是一个小型网站,数据很少,并且分区会增加维护成本,则没有必要。

您的文档非常详细,比您第一次接触分段时要好得多。
需要实践一下才知道效果,不用看理论。
如果有时间的话,多思考一下,决定在什么情况下使用哪种分区方式。
多尝试几次,你就会找到感觉了。

如何在MySQL中删除错误的分区方案?通过ALTER TABLE REORGANIZE PARTITION

删除MySQL错误分区必须按顺序完成。

首先检查分区状态。
使用 SHOW CREATE TABLE your_table_name;允许。
例如,按范围分区(YEAR(SALE_DATE))。

应该进行备份。
使用 mysqldump 或 select into outfile。
就像 mysqldump -u your_user -p your_database your_table_name > backup.sql 一样。

建议重组部门。
例如alter table_your_table_name,重新组织分区为全部(分区p_小于新值(MAXVALUE); 请注意,表必须有主键或唯一索引。

验证。
再次运行 SHOW CREATE TABLE your_table_name;看到分工就结束了。

新设计。
根据业务需求选择分区键。
例如,按日期分区 RANGE(YEAR(sale_date))。
使用 EXPLAIN 进行测试以查看是否使用了分区索引。

不确定,但这就是经验。
你自己掂量一下吧。