sql优化

MySQL优化(5):分区

时间秒杀一切 提交于 2020-03-11 16:37:12
分区: 分区也是MySQL优化中的一个重要方式 将一个表中的数据和索引,分散到不同的文件中进行存储 通常情况下,一个表,对应一组数据和索引文件,一个表的数据和索引集中存储在这组文件中 当一个表出现了大量的记录时,可以将其分布到不同的数据和索引文件中进行存储 Innodb来说,一个表对应多个ibd文件 MyISAM来说,一个表对应多个myi,myd文件 分布之后,每个文件中包含的记录数量显著减少,保证单独文件的执行效率 最常用的分区语法是:使用ID,将数据分布到多个分区中 在设计表的时候使用partition选项完成分区,需要提供分区算法和算法参数,完成分区操作 create table [table-name]( id int unsigned auto_increment primary key, subject varchar(255), content text )charset utf8 engine innodb partition by hash(id) partitions 10 ; 正常的建表语句,最后一行表示利用ID字段,使用HASH算法,将数据分布到十个分区内 建表成功之后,可以发现数据库中虽然只是一张表,但是文件夹中会有十个ibd文件,一个frm文件(结构文件)和一个par文件(分区结构文件) 分区成功后:客户端和以前没有任何区别

sqlserver 2005新特性

。_饼干妹妹 提交于 2020-03-11 13:11:14
一、数据库设计方面 1、字段类型。 varchar(max)\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。但是这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?是否碎片会引发效率问题?这都是需要进一步探讨的东西。 varbinary(max)代替image也让SQL Server的字段类型更加简洁统一。 XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!) 2、外键的级联更能扩展 可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。但是再开发调试阶段和OLAP环境中,外键是可以建立的。新版本中加入了SET NULL 和 SET DEFAULT 属性,能够提供能好的级联设置。 3、索引附加字段 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 4、计算字段的持久化 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能

数据库访问性能优化

自作多情 提交于 2020-03-11 11:31:52
数据库访问性能优化 特别说明: 1、 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识; 2、 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也可以参考,但许多观点不适合于KV数据库或内存数据库或者是基于SSD技术的数据库; 3、 本文未深入数据库优化中最核心的执行计划分析技术。 读者对像: 开发人员: 如果你是做数据库开发,那本文的内容非常适合,因为本文是从程序员的角度来谈数据库性能优化。 架构师: 如果你已经是数据库应用的架构师,那本文的知识你应该清楚90%,否则你可能是一个喜欢折腾的架构师。 DBA (数据库管理员): 大型数据库优化的知识非常复杂,本文只是从程序员的角度来谈性能优化,DBA除了需要了解这些知识外,还需要深入数据库的内部体系架构来解决问题。 引言 在网上有很多文章介绍数据库优化知识,但是大部份文章只是对某个一个方面进行说明,而对于我们程序员来说这种介绍并不能很好的掌握优化知识,因为很多介绍只是对一些特定的场景优化的,所以反而有时会产生误导或让程序员感觉不明白其中的奥妙而对数据库优化感觉很神秘。 很多程序员总是问如何学习数据库优化,有没有好的教材之类的问题。在书店也看到了许多数据库优化的专业书籍,但是感觉更多是面向DBA或者是PL/SQL开发方面的知识,个人感觉不太适合普通程序员

【mysql】使用Explain性能分析

人盡茶涼 提交于 2020-03-11 10:53:24
SQL查询瓶颈 CPU (SQL中对大量数据进行比较、关联、排序、分组,最大的压力在于比较) IO (服务器内存不能满足缓存数据,需要进行多次物理IO) 锁 (不适宜锁的设置导致线程阻塞,尤其是线程交叉查询,导致死锁) 服务器自身性能 (top,free, iostat和vmstat来查看系统的性能状态) Explain 使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析查询语句或是表结构的性能瓶颈。简单来说就是查看我们的SQL执行计划 主要作用有: 表的顺序读取 哪些索引可以使用 数据读取操作的操作类型 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 执行器主要包含的信息: 说明 id select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 1、id相同,从上往下执行 2、id不同,子查询的id值+1,id值越大优先级越高越先被执行 select_type 查询的类型,主要区别普通查询,联合查询,子查询等复杂查询 1、SIMPLE ,简单的 select 查询,查询中不包含子查询或者UNION 2、PRIMARY, 3、DERIVED 4、SUBQUERY 5、DEPENDENT SUBQUERY 6、UNCACHEABLE SUBQUREY 7、UNION 8、UNION

[MySQL]安装和启动

一笑奈何 提交于 2020-03-11 08:27:03
一 MySQL简介 1)MySQL MySQL是MySQL AB公司的数据库管理系统软件,是最流行的开源(Open Source,开放源代码)的关系型数据库管理系统。 2) MySQL具有以下主要特点。 高速: 高速是MySQL的显著特性,在MySQL中,使用了极快的“B树”磁盘表(MyISAM)和索引压缩;通过使用优化的“单扫描多连接”,能够实现极快的连接;SQL函数使用高度优化的类库实现,运行速度快。一直以来,高速都是MySQL吸引众多用户的特性之一,这一点可能只有亲自使用才能体会。 支持多平台: MySQL支持超过20种开发平台,包括Linux、Windows、FreeBSD、IBM AIX、HP-UX、Mac OS、OpenBSD、Solaris等,这使得用户可以选择多种平台实现自己的应用,并且在不同平台上开发的应用系统可以很容易在各种平台之间进行移植。 支持各种开发语言: MySQL为各种流行的程序设计语言提供支持,为它们提供了很多API函数,包括C、C++、Java、Perl、PHP等。 提供多种存储器引擎: MySQL中提供了多种数据库存储引擎,各引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能。 功能强大: 强大的存储引擎使MySQL能够有效应用于任何数据库应用系统,高效完成各种任务,无论是大量数据的高速传输系统

MySQL优化(2):存储引擎和锁

好久不见. 提交于 2020-03-11 00:45:01
存储引擎: 早期的时候,存在如何选择MyISAM和Innodb? 现在,Innodb不断地发展完善,成为了主流的存储引擎。 因此5.5之后的mysql,无脑选择Innodb即可。 MYSQL中的数据,索引以及其他的对象,是如何存储的,是一套文件系统的实现。 MYSQL支持很多的存储引擎,使用 SHOW ENGINES 即可查到全部的引擎 MyISAM和Innodb的比较: 1.存储文件的角度:MyISAM数据和索引分别存储,数据是.myd,索引是.myi;Innodb数据和索引集中存储为.ibd,不支持文件级别的移动 2.记录存储顺序的角度:MyISAM顺序存储,直接在表末尾插入记录;Innodb主键顺序存储,插入时需要排序操作,稍影响了效率 3.空间碎片的角度:MyISAM会产生;Innodb不会产生;空间碎片就删除了以前的记录,MyISAM将会空余下来一些空间 通俗来讲,就说原来存储文件100K,我删除了一部分记录后还是100K 优化MyISAM的空间碎片: OPTIMIZE TABLE XXX; 4.外键和事务的角度:MyISAM不支持;Innodb支持,保证数据的完整性 5.全文索引的角度:MyISAM不支持;Innodb新版本支持,但是不支持中文,所以很鸡肋 6.锁的角度:MyISAM表级锁定;Innodb行级锁定,表级锁定,处理并发能力更强 总结:没有特殊需求

MySQL常见问题

十年热恋 提交于 2020-03-10 20:20:02
1.UUID – UUID是通用唯一识别码的缩写,其目的是让分布式系统中的所有元素都能有唯一的便是信息,而不需要通过中央控制端来做辨识信息的指定。 – 三部分:时间戳生成的时间信息、主机的硬件时钟序列、主机的唯一机器识别号 SELECT UUID(); – 为了避免每个MySQL各自生成的主键产生重复 – UUID主键好处: – 1.降低了全局节点的压力,是的主键生成速度快 – 2.全局唯一 – 3.跨服务器合并数据很方面 – 缺点 : – 1.占16个字节,比INT(4),BIGINT(8)占空间 – 2.是字符串类型,查询速度慢 – 3.不是顺序增长的字符串,作为主键,数据写入IO随机性很大 – 主键自动增长的优点 – 1.占空间小;2.检索速度快;3.IO写入连续性好 2.在线修改表结构 – ALTER TABLE缺点: – 1.修改表的时候是锁表的,影响写入操作 – 2.如果修改表结构失败,必须还原表结构,耗时更长 – 3.大数据表记录多,修改表结构锁表时间长 – 可以用PerconaTookit工具包 – 链接 ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY

mysql回顾

馋奶兔 提交于 2020-03-10 17:06:26
一个问题引发的学习: mysql大表skip,limit访问尾部数据性能下降问题,对比结果如下 select * from big_table order by id asc LIMIT 5000000,5; /* Affected rows: 0 Found rows: 5 Warnings: 0 Duration for 1 query: 4.968 sec. */ select * from big_table a inner join (select id from big_table order by id ASC limit 5000000,5) b on a.id=b.id; /* Affected rows: 0 Found rows: 5 Warnings: 0 Duration for 1 query: 1.172 sec. */ 子查询方式,当排序方式为主键时,可以避免访问数据块,快速得到id; 这里回顾一下mysql基本数据结构 https://blog.csdn.net/caijunsen/article/details/83045985?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task 提高搜索效率,二叉排序树

(四)Mybatis 面试题

房东的猫 提交于 2020-03-10 13:52:51
Mybatis 86、Mybatis是什么? mybatis是一个持久层ORM框架。它内部封装了jdbc,使得开发更简洁,更高效。 Mybatis使开发者只需要关注sql语句本身,简化JDBC操作,不需要在关注加载驱动、创建连接、处理SQL语句等繁杂的过程。 MyBatis可以通过xml或注解完成ORM映射关系配置。 87、Mybatis和JDBC的关系? (标红) JDBC是Java提供的一个操作数据库的API; MyBatis是一个持久层ORM框架,底层是对JDBC的封装。 MyBatis对JDBC操作数据库做了一系列的优化: (1)mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。 (2)mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。 (3)mybatis 提供了一级和二级缓存,提高了程序性能。 (4)mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置) (5)mybatis对数据库操作结果进行自动映射 88、什么是ORM?(标红) ORM的全称是Object Relational Mapping,即对象关系映射。 描述的是对象和表之间的映射。操作Java对象,通过映射关系,就可以自动操作数据库。 在ORM关系中,数据库表对应Java中的类,一条记录对应一个对象,一个属性对应一个列。 常见的ORM框架

Mysql日志管理

陌路散爱 提交于 2020-03-10 11:50:17
错误日志 查询日志 慢查询日志 二进制日志 toc error log 错误日志 记录mysql启停错误信息用于排错 general log 普通日志 记录客户端查询日志用于开发 bin log 二进制日志 增量备份 DDL DML DCL 用于备份 relay log 中继日志 接收 replication master 常用于主从复制 slow log 慢查询日志 查询时间超过指定值用于调优 错误日志 Mysql 的错误日志 error log 记录 mysqld 服务进程启动/关闭或运行过遇到的错误日志。 错误日志默认开启(没有开启按照如下方式开启) ## 在配置文件 [mysqld] 标签内增加 log-error=/log/mysql/err.log [root@Mysql ~]# vim /etc/my.cnf [mysqld] ...... log-error=/log/mysql/err.log ## 创建对应目录与日志文件 [root@Mysql ~]# mkdir -p /log/mysql/ [root@Mysql ~]# touch /log/mysql/err.log ## 更改日志文件属主和属组为 mysql [root@Mysql ~]# chown -R mysql.mysql /log/mysql/err.log ## 重启数据库生效 [root