sql优化

mysql三:表操作

喜你入骨 提交于 2020-02-10 04:58:14
一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 一 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可以让存储引擎层的开发人员设 计他们希望的存储层,例如,有的应用需要满足事务的要求,有的应用则不需要对事务有这 么强的要求 ;有的希望数据能持久存储,有的只希望放在内存中,临时并快速地提供对数据 的查询。

数据库的索引和锁

荒凉一梦 提交于 2020-02-09 20:10:34
一、索引 在之前,我对索引有以下的认知: 索引可以加快数据库的检索速度 表经常进行 INSERT/UPDATE/DELETE操作就不要建立索引了,换言之:索引会降低插入、删除、修改等维护任务的速度。 -索引需要占物理和数据空间。 了解过索引的最左匹配原则 知道索引的分类:聚集索引和非聚集索引 Mysql支持Hash索引和B+树索引两种 看起来好像啥都知道,但面试让你说的时候可能就GG了: 使用索引为什么可以加快数据库的检索速度啊? 为什么说索引会降低插入、删除、修改等维护任务的速度。 索引的最左匹配原则指的是什么? Hash索引和B+树索引有什么区别?主流的使用哪一个比较多?InnoDB存储都支持吗? 聚集索引和非聚集索引有什么区别? … 1.1聊聊索引的基础知识 首先Mysql的基本存储结构是页(记录都存在页里边): 各个数据页可以组成一个双向链表 而每个数据页中的记录又可以组成一个单向链表 每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录 以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录。 所以说,如果我们写 select*fromuserwhereusername='Java3y’这样没有进行任何优化的sql语句

第1章 MySQL架构与历史

余生长醉 提交于 2020-02-09 19:54:34
MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式 1.1 MySQL逻辑架构 最上层服务大多数系统都有,连接处理、授权认证、安全等等 第二层包含MySQL的大多数核心功能 第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取 1.1.1 连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或者销毁线程。 当客户端连接到MySQL服务器时,服务器需要对其进行认证。认证基于用户名、原始主机信息和密码。如果使用了 安全套接字 SSL)的方式连接,还可以使用X.059证书认证。一旦客户端连接成功,服务器会继续验证该客户端是否具有执行某个特定查询的权限(例如,是否允许客户端对world数据库的Country表执行SELECT语句)。 1.1.2 优化与执行 MySQL会解析查询,并创建内部数据结构,然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。 对于SELECT语句,在解析查询之前

面试你所要知道的:MySQL存储过程

我与影子孤独终老i 提交于 2020-02-09 13:00:35
存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。 存储过程的优点: (1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).减少网络流量:针对同一个数据库对象的操作

suoyin

我与影子孤独终老i 提交于 2020-02-09 12:30:38
1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树. 对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询. 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序,原理同上. hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测. AAAA 和 AAAAB 的索引没有相关性. hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件

Java 编程(SQL 优化)

99封情书 提交于 2020-02-09 09:27:08
在传统的系统应用程序中我们通常都会和数据库建立连接进行数据的读写操作,为了减少连接数据库造成的资源消耗于是有了数据库连接缓冲池。在此基础上,SQL 语句的优化对于研发人员也是非常重要的,高效的 SQL 语句经常会给使一个业务逻辑的接口响应速度变得非常快。所以本篇 Chat 将主要从 SQL 语句的优化给出一些建议以及如何使用 SQL 语句里面的关键字等才能使 SQL 的执行效率相对提升,希望给研发人员在编写 SQL 语句时能有一些帮助。 Chat 主要内容: 常用 SQL 优化原则 减少表的连接数 临时表的使用 减少子查询的使用 常用 SQL 编写注意事项 避免 Select * 尽量避免进行全盘扫描 用 UNION 来代替:OR 用 exists 代替 in 谨慎使用 in 和 not in 为什么要避免使用游标 设置合理的字段属性 字段设置为:NOT NULL 尽量使用 JOIN 代替子查询 ORDER BY NULL 禁止不需要的排序 使用索引时应该注意什么 适合人群:后端开发人员、SQL 应用、SQL 优化 阅读全文: http://gitbook.cn/gitchat/activity/5e330f082a2c0f58575e0339 您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。 来源: CSDN 作者

小心设计数据库:让数据库变快的10个建议

混江龙づ霸主 提交于 2020-02-09 05:21:31
小心设计数据库:让数据库变快的10个建议 大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十个优化数据库速度的技巧。 大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十个优化数据库速度的技巧。 小心设计数据库 第一个技巧也许看来理所当然,但事实上大部分数据库的问题都来自于设计不好的数据库结构。譬如我曾经遇见过将客户端信息和支付信息储存在同一个数据库列中的例子。对于系统和用数据库的开发者来说,这很糟糕。新建数据库时,应当将信息储存在不同的表里,采用标准的命名方式,并采用主键。 来源: http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/ 清楚你需要优化的地方 如果你想优化某个查询语句,清楚的知道这个语句的结果是非常有帮助的。采用EXPLAIN语句,你将获得很多有用的信息,下面来看个例子: EXPLAIN SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table

让数据库变快的十个建议

假装没事ソ 提交于 2020-02-09 04:09:33
引用: http://www.admin10000.com/Document/198.html http://www.catswhocode.com/blog/   大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十个优化数据库速度的技巧。 1、小心设计数据库   第一个技巧也许看来理所当然,但事实上大部分数据库的问题都来自于设计不好的数据库结构。   譬如我曾经遇见过将客户端信息和支付信息储存在同一个数据库列中的例子。对于系统和用数据库的开发者来说,这很糟糕。   新建数据库时,应当将信息储存在不同的表里,采用标准的命名方式,并采用主键。   来源: http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/ 2、 清楚你需要优化的地方   如果你想优化某个查询语句,清楚的知道这个语句的结果是非常有帮助的。采用EXPLAIN语句,你将获得很多有用的信息,下面来看个例子: EXPLAIN SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;  

让数据库变快的10个建议

限于喜欢 提交于 2020-02-09 03:31:00
http://database.51cto.com/art/201203/324833.htm 大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十个优化数据库速度的技巧。 0. 小心设计数据库 第一个技巧也许看来理所当然,但事实上大部分数据库的问题都来自于设计不好的数据库结构。 譬如我曾经遇见过将客户端信息和支付信息储存在同一个数据库列中的例子。对于系统和用数据库的开发者来说,这很糟糕。 新建数据库时,应当将信息储存在不同的表里,采用标准的命名方式,并采用主键。 来源: http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/ 1. 清楚你需要优化的地方 如果你想优化某个查询语句,清楚的知道这个语句的结果是非常有帮助的。采用EXPLAIN语句,你将获得很多有用的信息,下面来看个例子: EXPLAIN SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table. column ; 来源: http://dev.mysql.com/doc/refman/5.0/en

MySQL之change buffer和buffer pool

房东的猫 提交于 2020-02-09 01:47:59
2020年第一篇, 比预计的时间延迟半个月, 突如其来的疫情让人不知所措, 应该没有哪个春节像今年一样了吧, 但愿疫情能够尽快过去, 一切早日恢复正常! 重新整理和复习MySQL相关知识, 其实主要是重新看之前记录的思维导图, 然后通过< >和<>来补充和温习, 所以以下很多都以截图的形式放上来了. buffer pool InnoDB的缓冲池缓存什么?有什么用? 缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用 总结: 缓冲池(buffer pool)是一种常见的降低磁盘访问的机制; 缓冲池通常以页(page)为单位缓存数据; 缓冲池的常见管理算法是LRU,memcache,OS,InnoDB都使用了这种算法; InnoDB对普通LRU进行了优化: 将缓冲池分为老生代和新生代,入缓冲池的页,优先进入老生代,页被访问,才进入新生代,以解决预读失效的问题 页被访问,且在老生代停留时间超过配置阈值的,才进入新生代,以解决批量数据访问,大量热数据淘汰的问题 change buffer change buffer是InnoDB的写缓冲, 目的是降低写操作的磁盘IO 使用场景 适合 对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。这种业务模型常见的就是账单类、日志类的系统 不适合