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等等

另一种情况:数据量过亿

  数据量过亿只能使用传说中的大数据了。(做了这么多年开发,从来没接触过这玩意,可能都没进什么大公司的原因吧)

  hadoop家族,(具体怎么玩的暂时还不知道)

。。。

原文地址:https://www.cnblogs.com/spll/p/10253741.html

时间: 2024-07-28 22:16:21

mysql千万级数据优化查询的相关文章

mysql千万级数据量查询出所有重复的记录

查询重复的字段需要创建索引,多个条件则创建组合索引,各个条件的索引都存在则不必须创建组合索引 有些情况直接使用GROUP BY HAVING则能直接解决:但是有些情况下查询缓慢,则需要使用下面其他的方法 以下是本人整理出来的查询重复数据的SQL,适用于千万级数据量的MYSQL数据库. 1.适用于整数类型的 SELECT DISTINCT UId FROM vehicle WHERE 1=1 GROUP BY UId HAVING(COUNT(UId))>1; 2.分组排序 SELECT UId

MySQL 千万 级数据量根据(索引)优化 查询 速度

一.索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让人难以忍受了. 提升查询速度的方向一是提升硬件(内存.cpu.硬盘),二是在软件上优化(加索引.优化sql:优化sql不在本文阐述范围之内). 能在软件上解决的,就不在硬件上解决,毕竟硬件提升代码昂贵,性价比太低.代价小且行之有效的解决方法就是合理的加索引. 索引使用得当,能使查询速度提升上万倍,效

MYSQL千万级数据量的优化方法积累

1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是这样子: <?php for($i=0;$i< 100; $i++ ){ //echo "CREATE TABLE db2.mem

Mysql千万级数据删除实操-企业案例

某天,在生产环节中,发现一个定时任务表,由于每次服务区查询这个表就会造成慢查询,给mysql服务器带来不少压力,经过分析,该表中绝对部分数据是垃圾数据 需要删除,约1050万行,由于缺乏处理大数据的额经验,开始直接使用delete搭配where条件进行清理,最后执行了1个小时也没有完成,后来经过跟查询,1000万条数据 的删除需要几十个小时甚至上百小时,果断放弃,采用了迂回策略. 三步骤策略: 1.抽取需要保留的数据到备份表中 2.truncate旧表 3.备份的数据插入回来 通过以上思路果断在

mysql数据库添加索引优化查询效率

项目中如果表中的数据过多的话,会影响查询的效率,那么我们需要想办法优化查询,通常添加索引就是我们的选择之一: 1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) mysql>ALTER TABLE `ta

mysql 千万级数据查询效率实践,分析 mysql查询优化实践--本文只做了一部分,仅供参考

数据量, 1300万的表加上112万的表 注意: 本文只做了部分优化,并不全面,仅供参考, 欢迎指点. 请移步tim查看,因为写的时候在tim写的,粘贴过来截图有问题,就直接上链接了. https://823948977.docs.qq.com/T5e6dBYLoZz?opendocxfrom=tim 文章内容类似截图:

【转】Mysql千万级数据表结构修改

当需要对表进行ddl操作如加索引.增删列时,数据量小时直接在线修改表结构影响不大当表达到百万.千万数据就不能直接在线修改表结构 下面是具体的过程:1.备份数据select * from ih_order into outfile '/bak/order.txt';mysql> select * from ih_order into outfile 'D:/bak/order.txt';Query OK, 10001000 rows affected (1 min 30.18 sec) 2.复制原

mysql 千万级数据的导入导出

最近应公司要求,在做数据库的导入导出.经查询每天的数据量在350W条左右.经过大量测试,感觉以下方法比较好 数据导出:SELECT INTO-OUTFILE 基本语法: SELECT [INTO OUTFILE 'file_name' [CHARACTER SET charset_name] export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] 该语句分为两个部分.前半部分是一个普通的SELECT语句,通

Mysql千万级数据性能调优配置

背景: 笔者的源数据一张表大概7000多万条,数据大小36G,索引6G,加起来表空间有40G+,类似的表有4张,总计2亿多条 数据库mysql,引擎为innodb,版本5.7,服务器内存256G,物理内存几个T,硬件参数杠杠的,然而处理这些数据踩了不少坑,因 为之前没做过这方面的工作,现在记录下清洗的过程,详细的业务清洗过程和规则均记录在https://gitee.com/yanb618/zhirong/wikis 感受: 清洗从表名,字段名,字段类型,字段值,索引创建与删除做起,每每看到那秒数