sql优化

聊一聊关于MySQL的count(*)

我是研究僧i 提交于 2020-02-16 19:15:55
坚持更新Java技术栈相关总结,Java、MySQL、各种中间件等,关注公众号【阿丸笔记】获取第一时间更新。 收集技术相关电子书、面试题,有需要的小伙伴可以关注公众号【阿丸笔记】,无套路领取。 1. 背景 自从大家对于MySQL数据库的稳定性有了更高的追求后,经常有小伙伴有这样的疑问,对于count(*)这样的操作,有没有正确的姿势,或者有没有可以优化的地方? 但答案比较残酷,如果已经使用了正确的索引,那么基本上没有可以优化的地方。 一旦出现慢查询了,它就是慢查询了,要改,只能自己计数或者通过其他搜索平台来做。 今天,就一起来看看为什么会这样,并对大家日常会遇到的一些的困惑进行解答。 2. count(*)的实现方式 据说,MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高。 而我们的mysql一般都是用Innodb的引擎,Innodb是怎么实现count操作的呢? InnoDB 引擎就比较麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。 所以,当我们的表里面的记录越来越多的时候,count(*)就会越来越慢。 当然,我们这里说的都是不带where条件的,如果带上where条件的话,MyISAM也是很慢的。 3.正确的打开方式 嗯,首先还是说,mysql上不太推荐用count(*

mysqldump备份和恢复

那年仲夏 提交于 2020-02-16 18:57:55
一、备份单个数据库 1、备份命令:mysqldump   MySQL数据库自带的一个很好用的备份命令。是逻辑备份,导出 的是SQL语句。也就是把数据从MySQL库中以逻辑的SQL语句的形式直接输出或生成备份的文件的过程。 单实例语法(Syntax): mysqldump -u <username> -p <dbname> > /path/to/***.sql 多实例的备份语法(Syntax): mysqldump -u <username> -p <dbname> -S <sockPath> > /path/to/***.sql eg: mysqldump -u root -p wordpress > /opt/wordpress_$(date +%F).sql 2、参数解析 -A --all-databases:导出全部数据库 -Y --all-tablespaces:导出全部表空间 -y --no-tablespaces:不导出任何表空间信息 --add-drop-database每个数据库创建之前添加drop数据库语句。 --add-drop-table每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用--skip-add-drop-table取消选项) --add-locks在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。

ORACLE隐式类型转换

不问归期 提交于 2020-02-16 14:12:22
隐式类型转换简介 通常 ORACLE 数据库存在显式类型转换( Explicit Datatype Conversion ) 和隐式类型转换( Implicit Datatype Conversion )两种类型转换方式。如果进行比较或运算的两个值的数据类型不同时(源数据的类型与目标数据的类型),而且此时又没有转换函数时,那么 ORACLE 必须将其中一个值进行类型转换,使其能够运算。这就是所谓的隐式类型转换。其中隐式类型转换是自动进行的,当然,只有在这种转换是有意义的时候,才会自动进行。 Data Conversion Generally an expression cannot contain values of different datatypes. For example, an expression cannot multiply 5 by 10 and then add 'JAMES'. However, Oracle supports both implicit and explicit conversion of values from one datatype to another. 关于隐式类型转换,建议翻看官方文档 “ Data Type Comparison Rules ” 章节,下面是官方文档中的隐式类型转换矩阵。从下面这个表格

mysql三:表操作

旧街凉风 提交于 2020-02-16 08:13:26
阅读目录 一 存储引擎介绍 二 表介绍 三 创建表 四 查看表结构 五 数据类型 六 表完整性约束 七 修改表ALTER TABLE 八 复制表 九 删除表 一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 1. 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的 表 ===> 文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 :比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型, 表的类型不同 ,会对应mysql不同的 存取机制 ,表类型又称为 存储引擎 。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL

sql server数据库性能的优化

狂风中的少年 提交于 2020-02-16 07:29:11
KeyLife富翁笔记 作者: HongYuan 标题: sql server数据库性能的优化 关键字: 分类: 个人专区 密级: 公开 (评分: , 回复: 0, 阅读: 676) »» 数据库设计   实现sql server数据库的优化,首先要有一个好的数据库设计方案。在实际工作中,许多sql server方案往往是由于数据库设计得不好导致性能很差。实现良好的数据库设计必须考虑这些问题:   1. 逻辑数据库规范化问题   一般来说,逻辑数据库设计会满足规范化的前3级标准:   第1规范:没有重复的组或多值的列;   第2规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分;   第3规范: 一个非关键字段不能依赖于另一个非关键字段。   遵守这些规则的数据库设计会产生较少的列和更多的表,因而也就减少了数据冗余,也减少了用于存储数据的页。   2. 生成物理数据库   要想正确选择基本物理实现策略,必须了解和利用好数据库访问格式和硬件资源的操作特点,特别是内存和磁盘子系统i/o。以下是一些常用技巧:   与每个表列相关的数据类型应该反映数据所需的最小存储空间,特别是对于被索引的列更是如此。比如能使用smallint类型就不要用integer类型,这样索引字段可以被更快地读取,而且可以在一个数据页上放置更多的数据行,因而也就减少了i

性能调优 | 如何通过性能调优突破 MySQL 数据库性能瓶颈?

喜夏-厌秋 提交于 2020-02-16 07:15:30
本文出自头条号老王谈运维,转载请说明出处。 MySQL 数据库瓶颈对 DBA 程序员而言,是非常棘手的问题。要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?下面小编将从数据库数据库性能优化的目标和方法两方面阐述如何通过性能调优突破 MySQL 数据库性能瓶颈。 优化目标 减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。 降低 CPU 计算 除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了。order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标。 优化方法 改变 SQL 执行计划 明确了优化目标之后,我们需要确定达到我们目标的方法。对于 SQL 语句来说,达到上述2个目标的方法其实只有一个,那就是改变 SQL 的执行计划,让他尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,以达到 “减少 IO 次数” 和 “降低 CPU 计算” 的目标 order

数据库性能优化-1

丶灬走出姿态 提交于 2020-02-16 07:13:29
出处: https://www.cnblogs.com/easypass/archive/2010/12/ 08/1900127.html 1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬盘可能会是瓶颈点,为什么这些一般的工作我们能快速确认瓶颈点呢,因为我们对这些慢速设备的性能数据有一些基本的认识,如网络带宽是2Mbps,硬盘是每分钟7200转等等。因此,为了快速找到SQL的性能瓶颈点,我们也需要了解我们计算机系统的硬件基本性能指标,下图展示的当前主流计算机性能指标数据。 从图上可以看到基本上每种设备都有两个指标: 延时(响应时间):表示硬件的突发处理能力; 带宽(吞吐量):代表硬件持续处理能力。 从上图可以看出,计算机系统硬件性能从高到代依次为: CPU——Cache(L1-L2-L3)——内存——SSD硬盘——网络——硬盘 由于SSD硬盘还处于快速发展阶段,所以本文的内容不涉及SSD相关应用系统。 根据 数据库 知识,我们可以列出每种硬件主要的工作内容: CPU及内存:缓存数据访问、比较、排序、事务检测、SQL解析、函数或逻辑运算; 网络:结果数据传输、SQL请求、远程数据库访问(dblink); 硬盘:数据访问、数据写入

利用SQL索引提高查询速度

流过昼夜 提交于 2020-02-16 07:10:04
1.合理使用索引 索引是 数据库 中重要的 数据结构 ,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的 ISAM 索引结构。 索引的使用要恰到好处,其使用原则如下: 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而 使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据后,删除并重建索引可以提高查询速度。 (1)在下面两条select语句中: SELECT * FROM table1 WHERE field1<=10000 AND field1>=0; SELECT * FROM

利用SQL索引提高查询速度

十年热恋 提交于 2020-02-16 07:08:33
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的 ISAM 索引结构。 索引的使用要恰到好处,其使用原则如下: 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而 使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据后,删除并重建索引可以提高查询速度。 (1)在下面两条select语句中: SELECT * FROM table1 WHERE field1<=10000 AND field1>=0; SELECT * FROM table1

Sql建表和sql语句的注意事项

百般思念 提交于 2020-02-16 07:03:22
建表注意事项: 对于建表大家都不陌生,这里主要说明一下几点注意实现: 1、大数据字段最好剥离出单独的表,以便影响性能 2、使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度 3、给表建立主键,看到好多表没主键,这在查询和索引定义上将有一定的影响 4、避免表字段运行为null,如果不知道添加什么值,建议设置默认值,特别int类型,比如默认值为0,在索引查询上,效率立显。 5、建立索引,聚集索引则意味着数据的物理存储顺序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查询上优势显著,在频繁更新数据的字段上建立聚集索引,后果很严重,插入更新相当忙。 6、组合索引和单索引的建立,要考虑查询实际和具体模式. SQL语句注意事项: 熟悉SQL的人,都会写SQL语句,但到底效率如何,十万以下的数据量,根本没任何区别,但一些基础性的东西,还是得点滴做起 1、where语句的书写,当有多个查询条件时,sql是按照从右往左的顺序进行执行,也就是说写在最后的条件会最早被执行,这就意味着过滤数据量最多的 添加应该写在最后,这样才能在性能上达到最优 2、join语句,如果A表1000w,B表30条记录,则应该是A join B,sql执行会以B为准去关联A,性能显著 3、表变量和临时表