一张表差不多有100w+
条数据,给索引列(连续数值)加了normal index
,可以包含重复值,sql语句使用select 具体列
,对于连续数值范围查找使用between
,分别用DBeaver测试mysql
跟postman测试接口
,测试效果如下:
与去年测试的数据出现了偏差:navicat+select *+between
javascript:void(0)
期间想过的优化点:
MySQL处理达到百万级数据,如何优化?
1)搜索引擎的选择,Myisam支持多读数据处理,可返回全表行数,但不支持事务跟聚簇索引和外键;Innodb支持写入多数据操作,采用B+Tree,聚簇索引;
2)索引的建立,自增主键可子查询,Innodb的B+Tree索引、Hash索引;对大量重复值的列避免建立索引;//normal、B+Tree
3)sql语句优化,避免select *,尽量查询列,避免< like or等,会涉及全表遍历;//对于连续数值范围查找适用于between
4)引入中间件,redis缓存,将热数据存入缓存;
5)避免前端大量数据返回,可服务器端分页;//限制数据请求与返回
6)主从复制,读写分离;//master-slave
7)分区:partition by range();//range适用于连续的数值
8)实在不行,分库分表;先做垂直拆分,分布式系统;后做水平拆分(sharding-Proxy)
尝试将表分区,使用RANGE
分区
分区条件:
报错
:分区表必须含主键,但主键不允许有重复值,RANGE
分区利用取值范围来进行分区,区间必须连续且不重叠,使用values less than
进行分区定义,分区键必须是INT,或者表达式返回INT。不可取
alter table partitionTest.char1db
partition by range columns (POS)
(
partition p10 values less than (999963) engine=innodb,
partition p20 values less than (2000000) engine=innodb,
partition p30 values less than (3000000) engine=innodb,
partition p40 values less than (4000000) engine=innodb,
partition p50 values less than (5000000) engine=innodb,
partition p60 values less than (6000000) engine=innodb,
partition p70 values less than (7000000) engine=innodb,
partition p80 values less than (8000000) engine=innodb,
partition p90 values less than (9000000) engine=innodb,
partition pmax values less than maxvalue engine=innodb
);
后续报错:
原因:分区表没有创建或创建失败
即便是添加唯一索引,分区键也必须包含在唯一索引中。 总而言之,对于 MySQL
分区表,无法从数据库层面保证非分区列在表级别的唯一性,只能确保其在分区内的唯一性。