sql优化

mysql:悲观锁与乐观锁

好久不见. 提交于 2020-01-12 09:07:59
为什么会使用到数据库级别的锁? 你可能会有这么一个疑问:现在的程序已经提供了很完善的锁机制来保证多线程的安全问题,还需要用到数据库级别的锁吗?我觉得还是需要的,为什么呢?理由很简单,我们再编程中使用的大部分锁都是单机,尤其是现在分布式集群的流行,这种单机的锁机制就保证不了线程安全了,这个时候,你可能又会想到使用redis的setNX分布式锁 或者 zookeeper的强一致性来保证线程安全,但是这里我们需要考虑到一个问题,那就是成本问题,有的时候使用redis分布式锁以及zookeeper会增加维护的成本,结合实际出发,再说没有百分百安全的程序,所以再数据库层加锁,也能将安全再提升一级,所以还是有必要的。 什么是悲观锁 悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他 事务 ,以及来自外部系统的 事务处理 )修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的 排他性 ,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 通俗的讲:开启一个事务之后开启悲观锁,这时候数据库将会锁着你需要查询的某条数据或者某张表,其他事务中的查询将会处于阻塞状态,开启悲观锁事务里面操作不会被阻塞,这点有点类似java中的互斥锁,那什么时候锁记录

面试:做过sql优化吗?

霸气de小男生 提交于 2020-01-12 08:21:52
  近来面试找工作经常会遇见这种问题: 做过数据库优化吗?大数据量基础过吗?系统反应慢怎么查询?   这咱也没背过啊,面试还老问,现在的网站主要的压力都来自于数据库,频繁的数据库访问经常会使系统瘫痪,这样就需要进行sql优化。明天去58面试,今天来梳理一下。 1. 写明查询具体某几列,减少*的使用,表名过长时,尽量使用表的别名   *和列名一样 2,在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。   in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。   in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。 3、模糊查询like,尽量少用%   关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%, 4,

从应用层面优化mysql查询

六月ゝ 毕业季﹏ 提交于 2020-01-12 04:03:06
从应用层面优化mysql查询 1. 使用连接池 频繁的创建连接,关闭连接是比较浪费资源的,我们可以创建数据库连接池,提高访问性能 2.减少对MySQL的访问 避免对数据库重复的访问,能一次获取到数据,不要用两次去获取. 增加缓存层,比如例如mybaits的一级获取或者二级缓存,或者使用redis. 负载均衡 通过MySQL的主从复制,实现读写分离,使增删改操作走主节点,查询操作走从节点,降低单台服务器的读写压力. 采用分布式数据库架构.使用负载均衡在多台数据库服务器之间访问,降低单台服务器的压力. 来源: CSDN 作者: 小组长~ 链接: https://blog.csdn.net/chen_xiaoqi/article/details/103937752

MySql数据库

℡╲_俬逩灬. 提交于 2020-01-12 01:47:01
数据库设计步骤: 表结构 字段类型、是否允许为null、是否有默认值 索引设计 数据库引擎的选择 MySql数据库引擎:   概念:决定数据库数据增删改查的方式,MySQL的核心就是存储引擎;   InnoDB:默认的引擎,支持事务、外键,查询效率相对较低,安全性较高;   MyISAM:不支持事务,查询效率相对较高,增删改效率较低。 SHOW ENGINES # 命令来查看MySQL提供的引擎 SHOW VARIABLES LIKE 'storage_engine'; # 查看数据库默认使用哪个引擎    如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择 如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果 如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive 使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

sql优化

耗尽温柔 提交于 2020-01-12 00:20:17
1.查询条件中,一定不要使用select *,因为会返回过多无用的字段会降低查询效率。应该使用具体的字段代替*,只返回使用到的字段。 2. 避免在 select f1,(select f2 from tableB ).... from tableA (错)这样得到字段列。直接用tableA和tableB关联得到A.f1,B.f2就可以了。 3.避免隐含的类型转换如 : select id from employee where emp_id='8' (错) select id from employee where emp_id=8 (对) emp_id是整数型,用'8'会默认启动类型转换,增加查询的开销。 4.不要在where条件中使用左右两边都是%的like模糊查询,如: select * from t_order where customer like '%zhang%'(错) 这样会导致数据库引擎放弃索引进行全表扫描。 优化:尽量在字段后面使用模糊查询。如下: select * from t_order where customer like 'zhang%'(对) 5.不要在字段上用转换函数,尽量在常量上用,尽量不要在where条件中等号的左侧进行表达式.函数操作,会导致全表扫描 如: select id from employee where to_char

重温Oracle11g新特点ACS

為{幸葍}努か 提交于 2020-01-11 23:56:42
1. ACS简介 Oracle Database 11g提供了Adaptive Cursor Sharing (ACS)功能,以克服以往不该共享的游标被共享的可能性。ACS使用两个新指标:sensitivity and bindawareness来实施该特点。 2. ACS机制 2.1. Adaptive Cursor Sharing Metadata:Oracle 11g也提供了三个新视图和动态视图V$SQL的两个新列来允许DBA来确定优化器是否已经确定一个SQL语句为一个ACS的候选,并且,也可以通过它们来观察优化器分类SQL语句用以共享的执行计划所使用的业务规则: 视图 描述 V$SQL Two new columns are added: IS_BIND_SENSITIVE indicates if a SQL statement is bind-sensitive. If this column contains a value of (Y)es, it means that the optimizer peeked at the values of the statement’s bind variables so that it can calculate each predicate’s selectivity. Likewise, IS_BIND_AWARE

mysql-查询性能优化

梦想的初衷 提交于 2020-01-11 22:42:12
1、不要取出全部列,取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。应该严格禁止SELECT * 的写法。MySQL使用如下三种方式应用WHERE条件,从好到坏依次为:   1.1 在索引中使用WHERE条件来过滤不匹配的记录。这是在存储引擎层完成的。   1.2 使用索引覆盖扫描(Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在MySQL服务器层完成的,但无须在回表查询记录。   1.3 从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现Using Where)。这在MySQL服务器层完成,MySQL需要先从数据表独处记录然后过滤。 上面的例子说明了好的索引很重要。 2、如果发现查询需要扫描大量的数据但值返回少数的行,那么可以尝试下面的技巧优化它:   2.1 使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无须回表获取对应行就可以返回结果了。   2.2 改变库表结构。例如使用单独的汇总表。   2.3 重写这个复杂的查询,让MySQL优化器能够以更优化的方式执行这个查询。 重构查询:   1、一个复杂查询还是多个简单查询;   2、切分查询;   例如: DELECT FROM message WHERE created < DATE

SQL Server 存储过程

柔情痞子 提交于 2020-01-11 15:23:37
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、 存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程 时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T

Mysql中的锁机制详解

删除回忆录丶 提交于 2020-01-11 14:33:11
原文: MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁) 作者: 唐大麦 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。 Mysql用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 表级锁: 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁: 开销大,加锁慢;会出现死锁

MySQL数据备份及恢复(1)

拥有回忆 提交于 2020-01-11 11:30:14
前言 MySQL备份一般采用全库备份加日志备份的方式,根据业务的需要,可以采用每周日凌晨1点进行完全备份以及每小时进行一次增量备份,这样在MySQL故障后可以使用完全备份和日志备份尽可能的去恢复最完整的数据。 一、binlog日志恢复 MySQL的二进制日志记录着该数据库所有增删改的操作日志(前提是需要自己开启binlog),还包括了这些操作的执行时间,binlog的使用场景无外乎就是主从同步以及恢复数据库。开启binlog功能,需要编辑MySQL的主配置文件,如下: 1、查看二进制功能是否开启(如下,值为OFF,则表示未开启): 2、开启二进制日志功能: [root@mysql ~]# vim /etc/my.cnf #在mysqld字段下写入下面配置,以便开启二进制日志并指定二进制文件名 #开启二进制日志,需要指定server-id,否则服务将会启动失败 log-bin=/usr/local/mysql/data/bin_log server-id=1 [root@mysql ~]# systemctl restart mysqld #重启后,将在指定的目录下生成两个文件,如下: [root@mysql data]# pwd /usr/local/mysql/data [root@mysql data]# ls | grep bin_log bin_log.000001