精华内容
下载资源
问答
  • 最近遇到一个left join,表关联查询的SQL,很简单,如下: select count(0) from tableA left join tableB on tableA.col01 = tableB.col01 where col02 = ? tableA和tableB做左关联查询,但是速度巨慢,慢的想砸...

    最近遇到一个left join,表关联查询的SQL,很简单,如下:

    select count(0) from tableA left join tableB on tableA.col01 = tableB.col01 where col02 = ?

    tableA和tableB做左关联查询,但是速度巨慢,慢的想砸电脑~

    tableA表数据大概5万,tableB数据大概7万,2个表的col01列都添加了索引

    但是还是无比巨慢,然后百度了各种方式:

    • 1、左表数据量保持最低;
    • 2、加入索引;
    • 3、where里面尽可能过滤数据

    但是没任何用处,最后从别人那里才得知,原来是表数据字符编码导致的问题,具体原因如下:

      字符集 排序规则
    tableA utf8mb4 utf8mb4_general_ci
    tableB utf8 utf8_general_ci

    2个表的字符编码不一样,导致left join查询速度非常的慢

    所以,需要把2个表的字符编码,改成一致即可

    展开全文
  • 大家在开发过程中总能遇到某个数据需要加个字段数据的情况,然而有些数据要关联到大,就会造成总体查询效率大大降低的情况,这篇文章提供一个小思路,小技巧分享给大家。 上代码(需求场景是在主数据中加入一个...

    大家在开发过程中总能遇到某个数据表需要加个字段数据的情况,然而有些数据要关联到大表,就会造成总体查询效率大大降低的情况,这篇文章提供一个小思路,小技巧分享给大家。
    上代码(需求场景是在主数据中加入一个统计金额的数据,统计金额需要关联某个大表,造成大表连大表的尴尬情况):

    public PageInfo<Map> pageBill(Map params,Integer pageNum, Integer pageSize) {
    		//分页 分页场景使用更佳
            PageMethod.startPage(pageNum, pageSize); 
            //主数据查询
            List<Map> list = someBillMapper.listBill(params);
            if(list != null && list.size() > 0){
                /**
                   先将从数据需要用到的id提炼出来,此id是主数据与从数据关联的id(a.id = b.pid),
                   通过此id,从数据查询就可以精确高效的查询出需要的数据。
                */
                StringBuilder sb = new StringBuilder();
                for (Map m :list) {
                    sb.append(","+m.get("id"));
                }
                /**
                	从数据(通过上面得到的id直接查询需要的数据:
                	大概理解就是: select id,pid,amount from table where id in (提炼出来的id集)
                	此为简化的 实际场景复杂的多。
                */
                List<Map> otherAccount = someBillMapper.getOtherAccount(sb.toString().substring(1));
                /**
                	核心1:将查询出来的从数据通过map集合存起来,
                	key为从数据的关联pid(主 a.id = b.pid 从关系),value为整行map数据(id,pid,amount)
                */
                Map comMap = new LinkedHashMap();
                for (Map m :otherAccount) {
                    comMap.put(m.get("pid"),m);
                }
    			/**
    				核心2:遍历主数据,比对id,id相等将从数据插入主数据,实现主数据增加从数据。
    			*/
                for (Map p : list ) {
                    if(comMap.containsKey(p.get("id"))){
                        Map son= (Map) comMap.get(p.get("id"));
                        p.put("amount",son.get("amount"));
                    }
                }
            }
            PageInfo<Map> pageInfo = new PageInfo<Map>(list);
            return pageInfo;
        }
    

    (注意:一定要避免出现for循环里面再for循环(假如分页出来是100条,两个for循环是100+100,如果是双for循环就是100*100=10000次了),也不要在for循环里面进行数据库操作)
    大体就是这种思路,公司因为出台慢SQL标准,所以要尽量避免一个sql关联太多表查询,需要将业务拆分,以前的多表关联都要拆成单表,双表,在代码里跑,可以减轻数据库的负担同时减少慢sql的数量。不管几个表,拆解思路基本都是这样子。

    展开全文
  • 一、什么影响了数据库查询速度1.1 影响数据库查询速度的四个因素1.2 风险分析QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量...

    一、什么影响了数据库查询速度

    1.1 影响数据库查询速度的四个因素

    1c6f18ed29c74c4d784746ae8f9868f9.png

    1.2 风险分析

    QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
    TPS: 是 TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

    Tips: 最好不要在主库上数据库备份,大型活动前取消这样的计划。

    1. 效率低下的 sql:超高的 QPSTPS
    2. 大量的并发:数据连接数被占满( max_connection默认 100,一般把连接数设置得大一些)。 并发量:同一时刻数据库服务器处理的请求数量
    3. 超高的 CPU使用率: CPU资源耗尽出现宕机。
    4. 磁盘 IO:磁盘 IO性能突然下降、大量消耗磁盘性能的计划任务。解决:更快磁盘设备、调整计划任务、做好磁盘维护。

    1.3 网卡流量:如何避免无法连接数据库的情况

    • 减少从服务器的数量(从服务器会从主服务器复制日志)
    • 进行分级缓存(避免前端大量缓存失效)
    • 避免使用 select* 进行查询
    • 分离业务网络和服务器网络

    1.4 大表带来的问题( 重要

    1.4.1 大表的特点

    • 记录行数巨大,单表超千万
    • 表数据文件巨大,超过 10G

    1.4.2 大表的危害

    1.慢查询:很难在短时间内过滤出需要的数据 查询字区分度低 -> 要在大数据量的表中筛选出来其中一部分数据会产生大量的磁盘 io -> 降低磁盘效率

    2.对 DDL影响:

    建立索引需要很长时间:

    • MySQL-v<5.5 建立索引会锁表
    • MySQL-v>=5.5 建立索引会造成主从延迟( mysql建立索引,先在组上执行,再在库上执行)

    修改表结构需要长时间的锁表:会造成长时间的主从延迟('480秒延迟')

    1.4.3 如何处理数据库上的大表

    分库分表把一张大表分成多个小表

    难点:

    1. 分表主键的选择
    2. 分表后跨分区数据的查询和统计

    1.5 大事务带来的问题( 重要*)*

    1.5.1 什么是事务

    318b71134250365d3ec6f887d68cf4dd.png

    1.5.2事务的 ACID属性

    1、原子性( atomicity):全部成功,全部回滚失败。银行存取款。
    2、一致性(consistent):银行转账的总金额不变。
    3、隔离性(isolation):

    隔离性等级:

    • 未提交读( READ UNCOMMITED) 脏读,两个事务之间互相可见;
    • 已提交读( READ COMMITED)符合隔离性的基本概念,一个事务进行时,其它已提交的事物对于该事务是可见的,即可以获取其它事务提交的数据。
    • 可重复读( REPEATABLE READ) InnoDB的默认隔离等级。事务进行时,其它所有事务对其不可见,即多次执行读,得到的结果是一样的!
    • 可串行化( SERIALIZABLE) 在读取的每一行数据上都加锁,会造成大量的锁超时和锁征用,严格数据一致性且没有并发是可使用。

    查看系统的事务隔离级别: show variables like'%iso%';

    开启一个新事务: begin;

    提交一个事务: commit;

    修改事物的隔离级别: setsession tx_isolation='read-committed';

    4、持久性( DURABILITY):从数据库的角度的持久性,磁盘损坏就不行了

    d38db5805ddaca8f27bb2913e5499ecf.png

    edolog机制保证事务更新的一致性和持久性

    1.5.3 大事务

    运行时间长,操作数据比较多的事务;

    风险:锁定数据太多,回滚时间长,执行时间长。

    • 锁定太多数据,造成大量阻塞和锁超时;
    • 回滚时所需时间比较长,且数据仍然会处于锁定;
    • 如果执行时间长,将造成主从延迟,因为只有当主服务器全部执行完写入日志时,从服务器才会开始进行同步,造成延迟。

    解决思路:

    • 避免一次处理太多数据,可以分批次处理;
    • 移出不必要的 SELECT操作,保证事务中只有必要的写操作。

    二、什么影响了MySQL性能(非常重要)

    2.1 影响性能的几个方面

    1. 服务器硬件。
    2. 服务器系统(系统参数优化)。
    3. 存储引擎。 MyISAM: 不支持事务,表级锁。 InnoDB: 支持事务,支持行级锁,事务 ACID
    4. 数据库参数配置。
    5. 数据库结构设计和SQL语句。(重点优化)

    2.2 MySQL体系结构

    分三层:客户端->服务层->存储引擎

    40ab16ab3229878f0d3ec0aa6cb80ff2.png
    1. MySQL插件式的存储引擎,其中存储引擎分很多种。只要实现符合mysql存储引擎的接口,可以开发自己的存储引擎!
    2. 所有跨存储引擎的功能都是在服务层实现的。
    3. MySQL的存储引擎是针对表的,不是针对库的。也就是说在一个数据库中可以使用不同的存储引擎。但是不建议这样做。

    2.3 InnoDB存储引擎

    MySQL5.5及之后版本默认的存储引擎: InnoDB

    2.3.1 InnoDB使用表空间进行数据存储。

    show variables like'innodb_file_per_table

    如果innodbfileper_table 为 ON 将建立独立的表空间,文件为tablename.ibd;

    如果innodbfileper_table 为 OFF 将数据存储到系统的共享表空间,文件为ibdataX(X为从1开始的整数);

    .frm :是服务器层面产生的文件,类似服务器层的数据字典,记录表结构。

    2.3.2 (MySQL5.5默认)系统表空间与( MySQL5.6及以后默认)独立表空间

    • 1.1 系统表空间无法简单的收缩文件大小,造成空间浪费,并会产生大量的磁盘碎片。
    • 1.2 独立表空间可以通过 optimeze table 收缩系统文件,不需要重启服务器也不会影响对表的正常访问。
    • 2.1 如果对多个表进行刷新时,实际上是顺序进行的,会产生IO瓶颈。
    • 2.2 独立表空间可以同时向多个文件刷新数据。

    强烈建立对Innodb 使用独立表空间,优化什么的更方便,可控。

    2.3.3 系统表空间的表转移到独立表空间中的方法

    • 1、使用mysqldump 导出所有数据库数据(存储过程、触发器、计划任务一起都要导出 )可以在从服务器上操作。
    • 2、停止MYsql 服务器,修改参数(my.cnf加入innodbfileper_table),并删除Inoodb相关文件(可以重建Data目录)。
    • 3、重启MYSQL,并重建Innodb系统表空间。
    • 4、 重新导入数据。

    或者 Altertable 同样可以的转移,但是无法回收系统表空间中占用的空间。

    2.4 InnoDB存储引擎的特性

    2.4.1 特性一:事务性存储引擎及两个特殊日志类型:Redo Log 和 Undo Log

    1. Innodb 是一种事务性存储引擎。
    2. 完全支持事务的 ACID特性。
    3. 支持事务所需要的两个特殊日志类型: RedoLogUndoLog

    Redo Log: 实现事务的持久性(已提交的事务)。 Undo Log: 未提交的事务,独立于表空间,需要随机访问,可以存储在高性能io设备上。

    Undo日志记录某数据被修改前的值,可以用来在事务失败时进行 rollbackRedo日志记录某数据块被修改后的值,可以用来恢复未写入 data file的已成功事务更新的数据。

    2.4.2 特性二:支持行级锁

    1. InnoDB支持行级锁。
    2. 行级锁可以最大程度地支持并发。
    3. 行级锁是由存储引擎层实现的。

    2.5 什么是锁

    2.5.1 锁

    d3ede626b3aa5a7620531ef83d37963a.png

    2.5.2 锁类型

    f5a40339d368ee96817fdc97432f533c.png

    2.5.3 锁的粒度

    MySQL的事务支持不是绑定在MySQL服务器本身, 而是与存储引擎相关

    0dba4a9d6ee5a9e5fdabdcac00b4e9ad.png

    将table_name加表级锁命令: locktable table_name write; 写锁会阻塞其它用户对该表的‘读写’操作,直到写锁被释放: unlock tables

    1. 锁的开销越大,粒度越小,并发度越高。
    2. 表级锁通常是在服务器层实现的。
    3. 行级锁是存储引擎层实现的。innodb的锁机制,服务器层是不知道的

    2.5.4 阻塞和死锁

    (1)阻塞是由于资源不足引起的排队等待现象。 (2)死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放。

    2.6 如何选择正确的存储引擎

    参考条件:

    1. 事务
    2. 备份( Innobd免费在线备份)
    3. 崩溃恢复
    4. 存储引擎的特有特性

    总结: Innodb 大法好。

    注意: 尽量别使用混合存储引擎,比如回滚会出问题在线热备问题。

    2.7 配置参数

    2.7.1 内存配置相关参数

    确定可以使用的内存上限。
    内存的使用上限不能超过物理内存,否则容易造成内存溢出;(对于32位操作系统,MySQL只能试用3G以下的内存。)
    确定MySQL的 每个连接 单独 使用的内存。
    sort_buffer_size #定义了每个线程排序缓存区的大小,MySQL在有查询、需要做排序操作时才会为每个缓冲区分配内存(直接分配该参数的全部内存); join_buffer_size #定义了每个线程所使用的连接缓冲区的大小,如果一个查询关联了多张表,MySQL会为每张表分配一个连接缓冲,导致一个查询产生了多个连接缓冲; read_buffer_size #定义了当对一张MyISAM进行全表扫描时所分配读缓冲池大小,MySQL有查询需要时会为其分配内存,其必须是4k的倍数; read_rnd_buffer_size #索引缓冲区大小,MySQL有查询需要时会为其分配内存,只会分配需要的大小。

    注意: 以上四个参数是为一个线程分配的,如果有100个连接,那么需要×100。

    MySQL数据库实例:
     ①MySQL是 单进程多线程(而oracle是多进程),也就是说 MySQL实例在系统上表现就是一个服务进程,即进程;
     ②MySQL实例是线程和内存组成,实例才是真正用于操作数据库文件的;
    一般情况下一个实例操作一个或多个数据库;集群情况下多个实例操作一个或多个数据库。

    如何为缓存池分配内存:

    Innodb_buffer_pool_size,定义了Innodb所使用缓存池的大小,对其性能十分重要,必须足够大,但是过大时,使得Innodb 关闭时候需要更多时间把脏页从缓冲池中刷新到磁盘中;

    总内存-(每个线程所需要的内存*连接数)-系统保留内存

    key_buffer_size,定义了MyISAM所使用的缓存池的大小,由于数据是依赖存储操作系统缓存的,所以要为操作系统预留更大的内存空间;

    select sum(index_length) from information_schema.talbes where e``ngine=``'myisam'

    注意: 即使开发使用的表全部是Innodb表,也要为MyISAM预留内存,因为MySQL系统使用的表仍然是MyISAM表。

    max_connections 控制允许的最大连接数, 一般2000更大。

    不要使用外键约束保证数据的完整性。

    2.8 性能优化顺序

    从上到下:

    b4a5b18c7af4a87ff5c6b142eb8f5dc7.png
    展开全文
  • 搜云库技术团队关注送4000G架构师视频关注什么影响了数据库查询速度1.1 影响数据库查询速度的四个因素1.2 风险分析QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定...
    168a7193a06642afaf06a5e42e9621a9.png搜云库技术团队关注送4000G架构师视频关注

    什么影响了数据库查询速度

    1.1 影响数据库查询速度的四个因素

    66e763029b3adb53f508fdf8a92a58f6.png

    1.2 风险分析

    QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

    TPS:TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

    Tips:最好不要在主库上数据库备份,大型活动前取消这样的计划。

    1、效率低下的 sql:超高的 QPSTPS。 2、大量的并发:数据连接数被占满( max_connection默认 100,一般把连接数设置得大一些)。

    并发量:同一时刻数据库服务器处理的请求数量

    3、超高的 CPU使用率: CPU资源耗尽出现宕机。 4、磁盘 IO:磁盘 IO性能突然下降、大量消耗磁盘性能的计划任务。解决:更快磁盘设备、调整计划任务、做好磁盘维护。

    1.3 网卡流量:如何避免无法连接数据库的情况

    1、减少从服务器的数量(从服务器会从主服务器复制日志) 2、进行分级缓存(避免前端大量缓存失效) 3、避免使用 select 进行查询 4、分离业务网络和服务器网络

    1.4 大表带来的问题(重要)

    1.4.1 大表的特点

    1、记录行数巨大,单表超千万 2、表数据文件巨大,超过 10G

    1.4.2 大表的危害

    1、慢查询:很难在短时间内过滤出需要的数据

    查询字区分度低 -> 要在大数据量的表中筛选出来其中一部分数据会产生大量的磁盘 io -> 降低磁盘效率

    2.对 DDL影响:

    建立索引需要很长时间:

    MySQL-v<5.5 建立索引会锁表 MySQL-v>=5.5 建立索引会造成主从延迟( mysql建立索引,先在组上执行,再在库上执行)

    修改表结构需要长时间的锁表:会造成长时间的主从延迟('480秒延迟')

    1.4.3 如何处理数据库上的大表

    分库分表把一张大表分成多个小表

    难点:

    1、分表主键的选择 2、分表后跨分区数据的查询和统计

    1.5 大事务带来的问题(重要)

    1.5.1 什么是事务

    事务是数据库系统区别于其他一切文件系统的重要特性之一

    事务是一组具有原子性的SQL语句,或是一个独立的工作单元

    事务要求符合:原子性、一致性、隔离性、持久性

    1.5.2事务的 ACID属性

    1、原子性( atomicity):全部成功,全部回滚失败。银行存取款。 2、一致性(consistent):银行转账的总金额不变。 3、隔离性(isolation):

    隔离性等级:

    未提交读( READ UNCOMMITED) 脏读,两个事务之间互相可见; 已提交读( READ COMMITED)符合隔离性的基本概念,一个事务进行时,其它已提交的事物对于该事务是可见的,即可以获取其它事务提交的数据。 可重复读( REPEATABLE READ) InnoDB的默认隔离等级。事务进行时,其它所有事务对其不可见,即多次执行读,得到的结果是一样的! 可串行化( SERIALIZABLE) 在读取的每一行数据上都加锁,会造成大量的锁超时和锁征用,严格数据一致性且没有并发是可使用。

    查看系统的事务隔离级别: show variables like'%iso%';开启一个新事务: begin;提交一个事务: commit;修改事物的隔离级别: setsession tx_isolation='read-committed';

    4、持久性( DURABILITY):从数据库的角度的持久性,磁盘损坏就不行了

    19093a3419e26a87f3e1f45bdc0d1e14.png

    redolog机制保证事务更新的一致性持久性

    1.5.3 大事务

    运行时间长,操作数据比较多的事务;

    风险:锁定数据太多,回滚时间长,执行时间长。

    1、锁定太多数据,造成大量阻塞和锁超时; 2、回滚时所需时间比较长,且数据仍然会处于锁定; 3、如果执行时间长,将造成主从延迟,因为只有当主服务器全部执行完写入日志时,从服务器才会开始进行同步,造成延迟。

    解决思路:

    1、避免一次处理太多数据,可以分批次处理; 2、移出不必要的 SELECT操作,保证事务中只有必要的写操作。

    什么影响了MySQL性能(非常重要)

    2.1 影响性能的几个方面

    1、服务器硬件。 2、服务器系统(系统参数优化)。 3、存储引擎MyISAM:不支持事务,表级锁。 InnoDB: 支持事务,支持行级锁,事务 ACID。 4、数据库参数配置。5、 数据库结构设计和SQL语句。(重点优化)

    2.2 MySQL体系结构

    分三层:客户端->服务层->存储引擎

    c2101fee77fe5d68f3a077337329a52f.png

    1、 MySQL插件式的存储引擎,其中存储引擎分很多种。只要实现符合mysql存储引擎的接口,可以开发自己的存储引擎! 2、所有跨存储引擎的功能都是在服务层实现的。 3、MySQL的存储引擎是针对表的,不是针对库的。也就是说在一个数据库中可以使用不同的存储引擎。但是不建议这样做。

    2.3 InnoDB存储引擎

    MySQL5.5及之后版本默认的存储引擎InnoDB

    2.3.1 InnoDB使用表空间进行数据存储。

    show variables like'innodb_file_per_table

    如果innodbfileper_table 为 ON 将建立独立的表空间,文件为tablename.ibd;

    如果innodbfileper_table 为 OFF 将数据存储到系统的共享表空间,文件为ibdataX(X为从1开始的整数);

    .frm :是服务器层面产生的文件,类似服务器层的数据字典,记录表结构

    2.3.2 (MySQL5.5默认)系统表空间与( MySQL5.6及以后默认)独立表空间

    1、系统表空间无法简单的收缩文件大小,造成空间浪费,并会产生大量的磁盘碎片。 2、独立表空间可以通过 optimeze table 收缩系统文件,不需要重启服务器也不会影响对表的正常访问。 3、如果对多个表进行刷新时,实际上是顺序进行的,会产生IO瓶颈。 4、独立表空间可以同时向多个文件刷新数据。

    强烈建立对Innodb 使用独立表空间,优化什么的更方便,可控。

    2.3.3 系统表空间的表转移到独立表空间中的方法

    1、使用mysqldump 导出所有数据库数据(存储过程、触发器、计划任务一起都要导出 )可以在从服务器上操作。 2、停止MYsql 服务器,修改参数(my.cnf加入innodbfileper_table),并删除Inoodb相关文件(可以重建Data目录)。 3、重启MYSQL,并重建Innodb系统表空间。 4、 重新导入数据。

    或者 Altertable 同样可以的转移,但是无法回收系统表空间中占用的空间。

    2.4 InnoDB存储引擎的特性

    2.4.1 特性一:事务性存储引擎及两个特殊日志类型:Redo Log 和 Undo Log

    1、 Innodb 是一种事务性存储引擎。 2、完全支持事务的 ACID特性。 3、支持事务所需要的两个特殊日志类型: RedoLogUndoLog

    Redo Log:实现事务的持久性(已提交的事务)。Undo Log:未提交的事务,独立于表空间,需要随机访问,可以存储在高性能io设备上。

    Undo日志记录某数据被修改前的值,可以用来在事务失败时进行 rollbackRedo日志记录某数据块被修改后的值,可以用来恢复未写入 data file的已成功事务更新的数据。

    2.4.2 特性二:支持行级锁

    1、InnoDB支持行级锁。 2、行级锁可以最大程度地支持并发。 3、行级锁是由存储引擎层实现的。

    2.5 什么是锁

    2.5.1 锁

    锁的主要作用是管理共享资源的并发访问

    锁用于实现事务的隔离性

    2.5.2 锁类型

    40e463f888ea4abb5cbdc7a1de5aad34.png

    2.5.3 锁的粒度

    MySQL的事务支持不是绑定在MySQL服务器本身 而是与存储引擎相关

    • 表级锁

    • 行级锁

    table_name加表级锁命令: locktable table_name write; 写锁会阻塞其它用户对该表的‘读写’操作,直到写锁被释放: unlock tables

    1、锁的开销越大,粒度越小,并发度越高。2、表级锁通常是在服务器层实现的。 3、行级锁是存储引擎层实现的。innodb的锁机制,服务器层是不知道的

    2.5.4 阻塞和死锁

    1、阻塞是由于资源不足引起的排队等待现象。 2、死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放。

    2.6 如何选择正确的存储引擎

    参考条件:

    1、事务 2、备份( Innobd免费在线备份) 3、崩溃恢复 4、存储引擎的特有特性

    总结: nnodb大法好。注意: 别使用混合存储引擎,比如回滚会出问题在线热备问题。

    2.7 配置参数

    2.7.1 内存配置相关参数

    确定可以使用的内存上限。

    内存的使用上限不能超过物理内存,否则容易造成内存溢出;(对于32位操作系统,MySQL只能试用3G以下的内存

    确定MySQL的每个连接 单独使用的内存。

    sort_buffer_size

    定义了每个线程排序缓存区的大小,MySQL在有查询、需要做排序操作时才会为每个缓冲区分配内存(直接分配该参数的全部内存);

    join_buffer_size

    定义了每个线程所使用的连接缓冲区的大小,如果一个查询关联了多张表,MySQL会为每张表分配一个连接缓冲,导致一个查询产生了多个连接缓冲;

    read_buffer_size

    定义了当对一张MyISAM进行全表扫描时所分配读缓冲池大小,MySQL有查询需要时会为其分配内存,其必须是4k的倍数;

    read_rnd_buffer_size

    索引缓冲区大小,MySQL有查询需要时会为其分配内存,只会分配需要的大小。

    注意:以上四个参数是为一个线程分配的,如果有100个连接,那么需要×100。

    MySQL数据库实例:

    MySQL是单进程多线程(而oracle是多进程),也就是说 MySQL实例在系统上表现就是一个服务进程,即进程;

    MySQL实例是线程和内存组成,实例才是真正用于操作数据库文件的;

    一般情况下一个实例操作一个或多个数据库;集群情况下多个实例操作一个或多个数据库。

    如何为缓存池分配内存:

    Innodb_buffer_pool_size

    定义了Innodb所使用缓存池的大小,对其性能十分重要,必须足够大,但是过大时,使得Innodb 关闭时候需要更多时间把脏页从缓冲池中刷新到磁盘中;

    总内存-(每个线程所需要的内存*连接数)- 统保留内存

    key_buffer_size

    定义了MyISAM所使用的缓存池的大小,由于数据是依赖存储操作系统缓存的,所以要为操作系统预留更大的内存空间;

    select sum(index_length) from information_schema.talbes where engine='myisam'

    注意:即使开发使用的表全部是Innodb表,也要为MyISAM预留内存,因为MySQL系统使用的表仍然是MyISAM表。

    max_connections

    控制允许的最大连接数, 一般2000更大。不要使用外键约束保证数据的完整性

    2.8 性能优化顺序

    • 库结构设计和SQL语句

    • 数据库存储引擎的选择和参数配置

    • 系统选择及优化

    • 硬件升级

    作者:唐立勇

    https://segmentfault.com/a/1190000013672421

    更多技术干货

    近期100多篇技术干货,升职加薪必看

    百度、腾讯、阿里、谷歌 面试题视频详解合集

    小团队从单体应用,微服务,容器化,的架构演进之路

    面试中经常被问到的 Redis 持久化与恢复

    分库分表就能无限扩容吗

    133 道 Java 面试题及答案

    数据库分库分表,何时分?怎样分?

    Java并发编程75道面试题及答案

    d907c3a92b5227afc5c444363c02e79e.png

    展开全文
  • 通过线程池方式来帮助我们完成异步请求关键在于线程池的core大小如何设置,如果设置过大,会导致创建很多个线程,势必会造成CPU的压力比较大,由于大多数情况下集群是没有做CPU隔离策略的,就会影响到其他任务;...
  • 什么影响了数据库查询速度1.1 影响数据库查询速度的四个因素1.2 风险分析QPS:QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的...
  • 问题7:数据库多表关联方式

    千次阅读 2016-12-30 15:43:13
    在关系型数据库中,多表关联方式是影响性能最大的技术。为什么会把mysql定义为中小型数据库?主要原因是mysql是不支持hash join的。这对多个大表关联查询造成性能的瓶颈。因此,在大数据领域,比较少使用mysql作为...
  • 1.如果需要关联查询出的数据量很大,不能在for循环中一...由于数据量大,需要关联其它表查询速度慢。 2.如果需要关联查询出的数据量小,可以for循环(一页的数据)中关联查询,并且通过主键或索引查询,性能没有影响
  • 但在实际查询中如果从B库进行两关联却会导致A库中大的全扫描,查询速度慢是次要的,关键是全扫描会影响到A库的正常运行。 通过对SQL语句的不断调整、优化发现当两进行简单的关联查询时,
  • 1.尽量避免不要用一个去存储数据,可以建多张表,然后留一个字段作为多关联字段。 2.创建主索引字段(尽量在常用的或者是唯一的列上做主索引),主索引只能有一个,但是索引可以建多个,但是索引列越少越好,...
  • 数据分割策略和实现

    千次阅读 2016-05-23 19:06:21
    另外,分表可以按照业务紧密度和单进行分割,前者属于垂直分割数据,就是将业务紧密度高并且增长速度快的多张表划入到同一个数据库(此中分割往往会破坏关联关系),而后者是将一张或几张大数据量表中的数据...
  • 语句中有表关联,有uion,还有substr都会影响查询效率。但是真正然速度慢的原因是and rownum = 1语句。 执行时间需要6秒-9秒,对于查询速度实在是不能忍。 select t.a, t.b, t.c, t.d from (select t1.a, t1.b, t1....
  • mysql调优三-查询优化

    2021-01-12 17:10:04
    文章目录mysql调优-查询优化一、影响查询速度因素二、优化数据1.数据量三、执行过程优化1.查询缓存2.语法解析器预处理3.查询优化器4.关联查询三、特定类型查询优化1.优化count()查询2.优化关联查询3.优化limit分页...
  • 关系型数据库的查询瓶颈 当用户表的数据达到几千万甚至几亿级别的时候,对单条数据的检索将花费数秒甚至达到分钟级别。...多表关联后的复杂查询,以及频繁的group by或者order by操作,此时,性能下降较为明显。 ...
  • 函数、扫描记录过多等都会影响查询的速度,如果提高sql语句的查询速度是至关重要的。 一、 常用分页查询 (1)未用索引 对于小数据量的,我们经常采用(select * from table limit x,y)的形式来完成分页查询。例如...
  • 1.子查询1.1....执行子查询时,MYSQL需要创建临时查询完毕后再删除这些临时,所以,子查询速度会受到一定的影响,这里多了一个创建和销毁临时的过程2.连接查询(join)2.1.可以使用连接查询(JOIN...
  • 2.子查询就更别用了,效率太差,执行子查询时,MYSQL需要创建临时查询完毕后再删除这些临时,所以,子查询速度会受到一定的影响,这里多了一个创建和销毁临时的过程。 3.如果是JOIN的话,它是走嵌套查询...
  • 2.子查询就更别用了,效率太差,执行子查询时,MYSQL需要创建临时查询完毕后再删除这些临时,所以,子查询速度会受到一定的影响,这里多了一个创建和销毁临时的过程。 3.如果是JOIN的话,它是走嵌套查询...
  • 我在电信行业和信息安全行业里的工作经历发现,目前网络上的哈希算法都在查询速度上远远无法满足日趋增长的网络大数据要求。因此产生了自己写算法的想法。 现在我把自己的算法初稿发布出来,用我在一家信息安全的...
  • 通常的查询速度影响元素:1 lock 锁概念(nolock) (这也是查询慢最常见的问题,是程序设计的缺陷)2 函数的应用(right、ltrim、rtrim,case when then end,日期函数)3 关联复杂,记录多4、没有索引或者没有用到索引...
  • 我在电信行业和信息安全行业里的工作经历发现,目前网络上的哈希算法都在查询速度上远远无法满足日趋增长的网络大数据要求。因此产生了自己写算法的想法。 现在我把自己的算法初稿发布出来,用我在一家信息安全的...
  • 查询嵌套过多对性能有影响查询关联特别多也影响性能  频繁访问数据等等 SQL如何被SQLServer执行的 SQL执行原理  解释:首先解释SQL语句【语法是否正确】  解析:检验语句的出现的对象是否有效...
  • 聚集索引是指数据库行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个只能有一个聚集索引,因为一个的物理...查询不一定关联的列单独分出一张. 做对应关联. 外键. 外键约束去掉,锁很多,占用资源...
  • HBase

    2020-05-04 12:33:56
    HBASE 第 1 章NoSQL简介 1.1 关系型数据库的查询瓶颈 当用户表的数据达到几千万甚至几亿级别的时候,对单条数据的检索将花费数秒甚至达到分钟级别。实际情况更复杂,查询的操作速度...②多表关联后的复杂查询...
  • 从全文检索得知

    2019-09-27 12:41:43
    内存(小,读取速度快,CPU主要处理内存) 与硬盘(大,速度慢,...(2)查询条件:查询条件的先后顺序影响查询速度全文索引:问题在于分词。由于关键字是有数据库自己创建的,如果读取到的是一个无意义的关键字,...
  • Hbase简介

    2021-02-06 10:54:47
    第一章 NoSQL简介 1.1 关系型数据库查询瓶颈 当用户表的数据达到几千万甚至几亿... 多表关联后的复杂查询,以及频繁的group by或者order by操作,此时,性能下降较为明显。 1.2 CAP定理 CAP定理 Consistency(强
  • 超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

表关联影响表查询速度