mysql千万级数据优化查询
我们在做一个项目,一个网站或一个app时,用户量巨增,当使用的mysql数据库中的表数据达到千万级时,可以从以下方面考滤优化:
1、在设计数据库表的时候就要考虑到优化
2、查询sql语句上的优化
3、从数据库设计上进行结大框架的设计:如分区、分表、分库
1、在设计数据库表的时候就要考虑到优化
1、尽可能使用not null定义字段,避免null值字段出现,null值会占用额外的索引空间
2、使用固定长度的字段类型如char而不是varchar
3、添加索引,在查询频繁的字段上加索引,如在where,group by, order by,on中出现的字段加索引
4、字符字段只建立前缀索引,字符字段最好不要做主键
2、查询sql语句上的优化
1、不要使用select * 查询,将要查找的字段写出来
2、使用join来代替子查询
3、使用limit 对查询结果的记录进行限定,千万级别的数据太多,后面的数据没必要查出来
4、OR改写成IN:因为OR的效率是n级别,IN的效率是log(n)级别
5、少使用触发器和函数,可在应用程序代码实现
6、也尽量少用join
7、尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
8、列表数据不要拿全表的数据,要使用limit 来分页
来说说MySql的引擎:
目前广泛使用的是MyISAM和InnoDB两种引擎:
MyISAM引擎,MySQL5.1之前版本默认引擎,它的特点是:不支持行锁,不支持事务,不支持外键
InnoDB引擎,MySQL5.5后默认引擎,它的特点:支持行锁,采用MVCC来支持高并发,支持事务,支持外键,不支持全文索引
分区:
分区我不太明白,没怎么看懂
分表:
分表就是把一张超多数据的表,分成多张表,把一次查询,分成多次查询,然后把结果组合返回给用户。
分表:又有两种方式,分为垂直拆分和水平拆分,通常以某个字段做拆分项,比如以id字段拆分为100张表:表名为tableName_id%100
分表只适合开发初期做好分表处理,不适合应用上线后再做修改,成本太高。
分库:
分库:就是把一个数据库分成多个,然后做读写分离。
有钱的话,使用其他方法,阿里云数据库POLARDB,阿里云OcenanBase (淘宝使用,扛得住双十一),阿里云HybridDB for MySQL (原PetaData) ,腾讯云数据库:腾讯云DCDB等等
另一种情况:数据量过亿
使用子查询,优化分页查询:
如果只是用普通分页查询:select * from t_order limit 0,10 查一页10条数据,几万条数据也就分个百页速度没啥影响,但是如果是几千万条数据,查100万页以后的数据,那就有问题了,用以下子查询来优化:
这也就是深度分页问题
select * FROM Product where id >= (select p.id from Product p where p.timeCreated > "2020-09-12 13:34:20" limit 10000000, 1) LIMIT 10;
也可使用inner join查询优化:
select * from InventorySku isk inner join (select id from InventorySku where inventoryId = 6058 limit 109500,500 ) as d on isk.id = d.id
海量数据还是要走ES搜索引擎,redis集群缓存等技术问题解决,没有哪家大公司会对着mysql的语句钻牛角尖
。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)