优化方案:主从同步+读写分离:这个表在有设备条件的情况下,读写分离,这样能减少很多压力,而且数据稳定性也能提高纵向分表:根据原则,每个表最多不要超过5个索引,纵向拆分字段,将部分字段拆到一个新表通常我们按以下原则进行垂直拆分:(先区分这个表中的冷热数据字段)把不常用的字段单独放在一张表;把text,blob等大字段拆分出来放在附表中;经常组合查询的列放在一张表中;缺点是:很多逻辑需要重写,带来很大的工作量。利用表分区:这个是推荐的一个解决方案,不会带来重写逻辑等,可以根据时间来进行表分区,相当于在同一个磁盘上,表的数据存在不同的文件夹内,能够极大的提高查询速度。横向分表:1000W条数据不少的,会带来一些运维压力,备份的时候,单表备份所需时间会很长,所以可以根据服务器硬件条件进行水平分表,每个表有多少数据为准。
如何使用MySQL中的实用函数及查询技巧?
一直以来,MySQL 只有针对聚合函数的汇总类功能,比如MAX, AVG 等,没有从 SQL 层针对聚合类每组展开处理的功能。不过 MySQL 开放了 UDF 接口,可以用 C 来自己写UDF,这个就增加了功能行难度。
这种针对每组展开处理的功能就叫窗口函数,有的数据库叫分析函数。
在 MySQL 8.0 之前,我们想要得到这样的结果,就得用以下几种方法来实现:
1. session 变量
2. group_concat 函数组合
3. 自己写 store routines
接下来我们用经典的 学生/课程/成绩 来做窗口函数演示
准备
学生表
mysql> show create table student \G*************************** 1. row ***************************Table: studentCreate Table: CREATE TABLE student (sid int(10) unsigned NOT NULL,sname varchar(64) DEFAULT NULL,PRIMARY KEY (sid)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)课程表
mysql> show create table course\G*************************** 1. row ***************************Table: courseCreate Table: CREATE TABLE `course` (`cid` int(10) unsigned NOT NULL,`cname` varchar(64) DEFAULT NULL,PRIMARY KEY (`cid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)成绩表