这儿先说明一下,网上很多人说阿里规则500w数据就要分库分表。实际上,这个500w并不是界说死的,而是与MySQL的装备以及机器的硬件有关。MySQL为了提高功用,会将表的索引装载到内存中。但是当表的数据抵达一mysql安装定的量的时分,会导致内面试技巧存无法存储这些索引,无法存储索引,就只能进mysql安装装备教程行磁盘IO,然后导致功用下降。
实战调优
我这儿有分页符怎样删去张表,数据有1000w,现在只需一个主键索引
CREATE TABLE `分页符怎样删去user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`uname` varcha面试问题r(20) DEFAULT NULL COMMENT '账号',
`pwd` varchar(20) DEFAULT NULL COMMENT '暗码',
`addr` varchar(80) DEFAULT NU索引超出了数组边界什么意思LL COM分页符和分节符的差异MENT '地址',
`tel` varchar(20) DEFAULT NULL COMM分页符ENT '电话',
`regtimysql数据库me` char(30) DEFAULT NULL COMMENT '注册时刻',
`age` int(11) DEFAULT NULL面试技巧 COMMENT '年岁',面试常见问题及回答技巧
PRIMARY分页符怎样删去 KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10000003索引图 DEFAULT CHARSET=utf8;
查询全部大约16s。可谓是适当慢了。一般咱们一索引有哪几种类型个后台体系,比如这个是MySQL一个电商途径,这个是mysql增修改查句子用户表。后台处理体系,一般会查询这些用户信息,做一些操作,比如后台直接索引符号新增用户啊,或许删去用户啊这些操作。
所以这面试技巧儿就诞生了两个需求,一个是查询count,一个是分页查询
咱们分别来查验一下count用的时刻和分页查询所用的时刻
select * from user limit 1, 10 //简直不用时
select * from user limysql数据库命令大全mit 1000000, 10 //0.35s
select * from user limit 5000000, 10 //1.7s
select * from user l分页预览怎样主动调整imit 9000000, 10 //2.8s
select coun索引是什么意思t(1) from user //1索引符号表明的含义.7s
从上面查询所用时刻能够看出来,阿里众包假如是分页查询的话,查询的数据越面试常见问题及回答技巧往后用时是越长的,查询count也需求1.7s。这显然是不符合咱们的要求的。所以,这儿咱们就需求优化。首要咱们这儿进行索引优化试试
首要看一下这是只需主键索引的执行计划:
alter table `user` add面试毛遂自荐简单大方 INDEX `sindex` (`uname`,`pwd`,`addr`,`tel`,`regtime`,`分页预览怎样设置出第二页age`)
看上面的执行计划,虽然type是从all->index,走了sindex索引,但是实际上查询速度并没有产生改变。
其实,创建联合索引,是为了有条件查询的时分速度更快,而不是全表查询
select * from user where uname='6.445329111484186' //3.5s(无联合索引)
select * from user wh面试问题大全及答案大全ere uname='6.44532911MySQL1484186' //0.003s(面试问题大全及答案大全有联合索引)
所以这便是有联合索引和无索引的距离
这儿基本上能够证明,加了索引和不加索引,进行全分页符怎样参加表查询的时分,功率便是会很慢
已然索引这个效果现已不好使了,那就只能找其他计划了。根据我之前mysql面试里边讲的,count咱们能够单独存储到一个表里边
CREATE TABLE `attribute` (
`id` int(11) NOT NULL,
`formname分页符和分节符的差异` varchar(50) COLLATE utf8_bi索引n NOT NULL COMMENT '表名',
`formcount` int(11) NOT NULL COMME面试NT '表总数据',
PRIMARY KEY (`id`)
)面试 ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
这儿说一下,这种表一般不会查全部,只会查询一条,所以建表的索引是什么意思时分,能够建成hash
select formcount from attMySQLribute where formnamemysql增修改查句子='user' //简直不用时
count就进行优化完了。假如上面mysql数据库有挑选条件的话,就能够树立索引,经过走索引挑选的方式来查询,这样就能够不用读这个count了。
那么,count是没问题了,分页查询优化要怎样优化呢?这儿能够运用子查询来优化
select * from user where
id&gmysql索引t;=(select id from user limit 9000000,1) limit 10 //1.7s
其实子查询这种写法,判别id,其实便是经过掩盖索引来查询。功率会大大添加。不过我这儿查验是1.7s,曾经在公司优化这方面的时分,比这个查询时刻要低,咱们也能够自己生成数据自己查验
但是假如说数据量太大了,我仍是主张走es或许进行一些默许挑选,coun面试技巧t能够单独列出来
至此,一个千万级的数据分页查询的优化就完成了。