sql优化

MySQL——开启慢查询

笑着哭i 提交于 2020-02-03 13:33:54
前言 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。 参数说明 slow_query_log 慢查询开启状态 slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录) long_query_time 查询超过多少秒才记录 设置步骤 查看慢查询相关参数 MySQL [(none)]> show variables like 'slow_query%'; +---------------------+----------------------------+ | Variable_name | Value | +---------------------+----------------------------+ | slow_query_log | ON | | slow_query_log_file | /data/mysql/mysql-slow.log | +---------------------+----------------------------+ 2 rows in set (0.00 sec) MySQL [(none)]> show variables like 'long_query_time'; +-

mysql索引的简介

*爱你&永不变心* 提交于 2020-02-03 09:21:08
1.索引是什么? 官方定义:索引是帮助MySQL高效获取数据的数据结构,所以索引的本质是数据结构。 当然还有一个更为简单的理解是:数据本身之外,数据库还维护这一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法, 而这个数据结构就是索引。 存储位置:因为索引本身也很好,因此不可能全部都放在内存中,往往都是以索引文件的方式存储在 磁盘 上。 默认索引采用的算法: 一般采用BTREE 。 2.索引的优势 1)类似图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本。 2)通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗。 3.索引的劣势 1)实际上索引也是一张表,该表的主要内容就是保存索引的字段,并且指向具体表的记录,因此索引会占据空间。 2)虽然索引可以提高查询速度,同时却会降低更新表的速度,如果对表进行insert、delete和update时,因为在这过程中,MySQL不仅要保存数据到具体表,也要保存索引文件。 3)索引只是提高sql效率的一个因素,如何建立索引需要花费大量是时间建立适合的索引。 4.索引的分类 1)单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。 2)唯一索引:索引列的值必须唯一,但允许有空值。 3)复合索引:一个索引包含多个数据表字段。(在高并发条件下,倾向建立复合索引

MySQL-索引优化案例

孤街浪徒 提交于 2020-02-03 09:17:36
单表优化 建表 create table article ( id int unsigned not null primary key auto_increment , author_id int unsigned not null , category_id int unsigned not null , views int unsigned not null , comments int unsigned not null , title varchar ( 255 ) not null , content text not null ) ; 插入数据 insert into article ( ` author_id ` , ` category_id ` , ` views ` , ` comments ` , ` title ` , ` conte nt ` ) values ( 1 , 1 , 1 , 1 , '1' , '1' ) , ( 2 , 2 , 2 , 2 , '2' , '2' ) , ( 1 , 1 , 3 , 3 , '3' , '3' ) ; 现在比如说我们要查询category_id为1且comments大于1的情况下,views最多的article_id 我们要完成这个功能应该使用的sql语句为 select * from article

主流开源SQL(on Hadoop)总结,不断改进的Hive始终遥遥领先

守給你的承諾、 提交于 2020-02-03 09:00:18
本文涵盖了6个开源领导者:Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto,还加上Calcite、Kylin、Phoenix、Tajo 和Trafodion。以及2个商业化选择Oracle Big Data SQL 和IBM Big SQL,IBM 尚未将后者更名为“Watson SQL”。 (有读者问:Druid 呢?我的回答是:检查后,我同意Druid 属于这一类别。) 更多精彩内容学习 点我学 使用SQL 引擎一词是有点随意的。例如Hive 不是一个引擎,它的框架使用MapReduce、TeZ 或者Spark 引擎去执行查询,而且它并不运行SQL,而是HiveQL,一种类似SQL 的语言,非常接近SQL。“SQL-in-Hadoop” 也不适用,虽然Hive 和Impala 主要使用Hadoop,但是Spark、Drill、HAWQ 和Presto 还可以和各种其他的数据存储系统配合使用。 不像关系型数据库,SQL 引擎独立于数据存储系统。相对而言,关系型数据库将查询引擎和存储绑定到一个单独的紧耦合系统中,这允许某些类型的优化。另一方面,拆分它们,提供了更大的灵活性,尽管存在潜在的性能损失。 下面的图1展示了主要的SQL 引擎的流行程度,数据由奥地利咨询公司Solid IT 维护的DB-Engines 提供。DB-Engines

SSM框架--mybatis

醉酒当歌 提交于 2020-02-03 07:15:19
五.mybatis相关 1.jdbc介绍 JDBC是Java制定的接口,数据库产商依照该接口编写与自家数据库配套的实现类。比如MySQL、Oracle、SqlServer等都有自己的不同实现,这些实现类的集合既是我们笼统意义上的“驱动”。 2.preparedstatement和statement的区别 数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,语法语义解析优化sql语句,指定执行计划执行并返回结果 但是很多情况,我们的一条sql语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如select 的where子句值不同,update的set子句值不同,insert 的values值不同).如果每次都需要经过上面的词法语义解析,语句优化,制定执行计划等,则效率就明显不行了 所谓预编译语句就是将这类语句的值用占位符替代,可以视为将sql语句模板或者说参数化 什么是预编译(将这条sql(解析完成)语句放入缓存执行计划中,如果有相同的sql语句进来,就会直接执行该sql(解析完成)语句,省去解析的过程) 下面列出PreparedStatement的几点优势。 1.PreparedStatement可以写动态参数化的查询用PreparedStatement你可以写带参数的sql查询语句

mysql学习记录(附案例)

折月煮酒 提交于 2020-02-03 03:46:54
2019年12月08日 数据库---数据的存储和管理的设备 安装数据软件-----mysql/oracle/sqlserver..... 数据库结构------数据库 对象(表,视图,索引,过程,函数) 字段(列) 数据块 数据 数据类型:数值int double.. 字符varchar char.. 日期date DATETIME time.. 开发模式 c/s: 需要安装独立的客户端软件 b/s: 不需要安装客户端软件,浏览器 sqlyog 人-------客户端软件------数据库mysql沟通 c/s 人----- 网页 ---------- 数据库 (html) (SQL) (java) sql语言: 1.DDL(定义语言) 对数据库对象进行操作的语言(create alter. drop.) 比如: 数据库 表 视图 2.DML(操作语言) 对数据库的数据进行操作(insert update. delete. select.) 3.DCL( 控制语言) 对象数据库的权限操作grant revoke. 4.TCL( 事务操作) 对数据库事务进行操作 commit. rollback. #-------------------------对数据库 #创建数据库的语法 CREATE DATABASE 数据库名 #使用数据库 USE DATABASE 数据库名 #删除数据库

MySQL sleep过多解决方法

不问归期 提交于 2020-02-03 03:20:27
睡眠连接过多,会对mysql服务器造成什么影响? 严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。 造成睡眠连接过多的原因? 1. 使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接) 2. 程序中,没有及时关闭mysql连接 3. 数据库查询不够优化,过度耗时。 那么,如果要从根本上解决sleep连接过多,就得从以上三点反复检查,但是见效并不快。 网上有人分享,使用shell脚本配合cron,定期杀死睡眠时间太久的连接,但是这种方法非常不可取,典型的以暴制暴,很可能导致数据崩溃,而且,还需要编写相应shell, 设置cron, 实施成本较繁琐,不推荐使用。 那么更好的办法应该是让mysql自己决定这些睡眠连接的命运,实施会更简单,有效。 mysql的配置文件中,有一项: wait_timeout, 即可设置睡眠连接超时秒数,如果某个连接超时,会被mysql自然终止,多好的办法! 如设置:  wait_timeout=100 #即设置mysql连接睡眠时间为100秒,任何sleep连接睡眠时间若超过100秒,将会被mysql服务自然终止,要比编写shell脚本更简单。 那么,对于正在运行中的生产服务器,在不能停止服务情况下,修改此项怎么办?很简单,以root用户登录到mysql,执行: set global wait_timeout

2.索引优化分析

試著忘記壹切 提交于 2020-02-02 15:59:08
性能下降SQL慢 、执行时间长 、 等待时间长 常见原因: 1.查询语句写的烂 2.索引失效 #id name email weixinNumber select *from user where name=""; select *from user where name="" and email=""; create index idx_user_name on user(name);#单值 create index idx_user_nameEmail on user(name,email);#复合 2.关联查询太多join(设计缺陷或不得已的需求) 3.服务器调优及各个参数设置(缓冲\线程数等) sql 执行顺序 #手写sql的顺序 7 select 8 distinct <select_list> 1 from <left_table> 3 <join_type> join <right_table> 2 on <join_condition> 4 where <where_condition> 5 group by <groupby_list> 6 having <having_condition> 9 order by <orderby_conditoin> 10 limit <limit number>; #机读 1. FROM <left_table> 2. ON

MySQL 使用B+树

半腔热情 提交于 2020-02-02 13:31:25
概述 首先需要澄清的一点是,MySQL 跟 B+ 树没有直接的关系,真正与 B+ 树有关系的是 MySQL 的默认存储引擎 InnoDB,MySQL 中存储引擎的主要作用是负责数据的存储和提取,除了 InnoDB 之外,MySQL 中也支持 MyISAM 作为表的底层存储引擎。 我们在使用 SQL 语句创建表时就可以为当前表指定使用的存储引擎,你能在 MySQL 的文档 Alternative Storage Engines 中找到它支持的全部存储引擎,例如: MyISAM 、 CSV 、 MEMORY 等,然而默认情况下,使用如下所示的 SQL 语句来创建表就会得到 InnoDB 存储引擎支撑的表: CREATE TABLE t1 ( a INT, b CHAR (20), PRIMARY KEY (a)) ENGINE=InnoDB; 想要详细了解 MySQL 默认存储引擎的读者,可以通过之前的文章 『浅入浅出』MySQL 和 InnoDB 了解包括 InnoDB 存储方式、索引和锁等内容,我们在这里主要不会介绍 InnoDB 相关的过多内容。 我们今天最终将要分析的问题其实还是,为什么 MySQL 默认的存储引擎 InnoDB 会使用 MySQL 来存储数据,相信对 MySQL 稍微有些了解的人都知道,无论是表中的数据(主键索引)还是辅助索引最终都会使用 B+ 树来存储数据

MySQL索引 - 索引的类型

橙三吉。 提交于 2020-02-02 12:15:08
索引的类型 B-Tree索引 B-Tree 索引 通常意味着所有的值都是 按顺序存储 的,并且每一个叶子页到根的距离相同。 B-Tree 索引 能够 加快访问数据的速度 ,存储引擎 不再需要进行全表扫描 来获取需要的数据,取而代之的是 从索引的根节点开始搜索 。 B-Tree 索引 适用于全键值、键值范围或键前缀查找( 最左前缀原则 )。 哈希索引 哈希索引 基于哈希表实现,只有 精确匹配索引 所有列的查询才有效。 哈希索引 是Memory引擎表的默认索引类型,但Memory同时也支持B-Tree索引。 哈希索引 自身 只需存储对应的哈希值和行指针 ,而 不存储字段值 ,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。 哈希索引 数据并不是按照索引值顺序存储的,所以 无法用于排序 。 哈希索引 不支持部分索引列匹配查找 ,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如数据列(A,B)上建立索引,如果查询只有数据列A,则无法使用该索引。 哈希索引 不支持任何范围查询 ,如WHERE score > 60。 哈希索引 只支持等值比较查询 ,包括=、IN()、<=>(注意<>和<=>是不同的操作)。 介绍一个 使用场景 :如需要存储大量的URL,并需要根据URL进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会非常大,因为URL本身很长。 创建表 1