MyISAM

MySQL表级锁和行级锁

∥☆過路亽.° 提交于 2019-11-27 10:35:40
一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);InnoDB存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MySQL主要的两种锁的特性可大致归纳如下:  表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。  行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 考虑上述特点,表级锁使用与并发性不高,以查询为主,少量更新的应用,比如小型的web应用;而行级锁适用于高并发环境下,对事务完整性要求较高的系统,如在线事务处理系统。 二:MyISAM锁细述 (1). 锁模式 MySQL的表级锁有两种模式: 表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。 (2). 如何加锁 当MyISAM在执行查询语句时,会自动给涉及到表加读锁,在执行更新操作时,会加写锁。当然用户也可以用LOCK TABLE 去显式的加锁。显式的加锁一般是应用于:需要在一个时间点实现多个表的一致性读取,不然的话,可能读第一个表时

[mysql] 锁机制

雨燕双飞 提交于 2019-11-27 10:35:11
前言   在计算机的世界里锁(lock)是为了协调多个进程或者多个线程并发的访问同一资源而被创造出来的。而在我们的mysql数据库中的锁也是为了解决并发访问同一资源的问题,下面我就来介绍下mysql中的锁的一些知识,如果有什么说的不对的地方,还希望各位大神指正。 锁的种类   在mysql数据库中,可以将锁分为3个种类: 表级锁 、 行级锁 、 页级锁 。 表级锁 定义:对整个表进行加锁处理,在你锁定期间,如果你是读锁,其他进程写操作无法对这张表进行操作。如果你是写锁,则其他进程无法对这张表进行操作。 引擎: MyISAM , InnoDB 优点: 加锁快 、 开销小 、 不会出现死锁 缺点: 锁定面积大 、 发生冲突的概率高 、 并发度低 表级锁模式 表共享读锁 :当一个进程对一张表加了读锁,那么其他的进程也可以同时对这张表加读锁,但是不能加写锁。(即多个用户可以同时读取同一张表的数据) 表独占写锁 :当一个进程对一张表加了写锁,那么其他任何进程都不可以加任何锁。 如何添加表级锁 lock tables table_name1 read local,table_name2 read local; select * from table_name1; select * from table_name2; lock tables; 注意: local 选项

实战 xtrabackup 全量备份&恢复 MySQL

吃可爱长大的小学妹 提交于 2019-11-27 10:21:42
1、背景 我们有一台业务数据库一直都只做了主从,虽然一定程度上解决了读写性能问题,但是这个是有风险的,比如某同学删除主库数据,从库也会跟着删除,所以及时的备份还是很有必要的。计划是每天全量备份两次,为什么不增量备份呢?两个原因: (1)增量备份在多库多表的场景下备份策略变得复杂,而且不易验证业务正确性 (2)增量备份在恢复的时候不能做到快速恢复,这在线上场景下是致命的,业务恢复分秒必争 2、技术选型 业界常用的备份工具有两个,一个是 MySQL 自带的管理工具 mysqldump,它能完成一般的数据库管理备份恢复工作,但是性能和功能比较弱,专业性欠缺。另外一个是 MySQL咨询公司Percona提供的 innobackupex,功能强大,性能优秀,是专业级的数据库备份恢复工具,基本算是业界应用最广泛的备份恢复工具了。 Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且开源。 Xtrabackup有两个主要的工具:xtrabackup、innobackupex,现在xtrabackup版本升级到了2.4.4,相比之前的2.1有了比较大的变化: innobackupex 功能全部集成到 xtrabackup 里面,只有一个

mysql学习(2)索引的本质

泪湿孤枕 提交于 2019-11-27 09:53:11
问题:SQL查询慢怎么办? 优化手段,加索引。 索引是 帮助MYSQL高效的获取数据的 排好序 的 数据结构。 问题:索引结构为什么使用Btree而不使用二叉树,红黑树或者HASH结构? 二叉树的特性,右边子节点的值大于父节点,且左边子节点的值小于父节点 二叉树:使用二叉树来做索引的数据结构,当索引值递增的时候,二叉树也会不断地增加右子节点 ,那么在查找索引的时候,所做的IO操作,等同于没有索引逐行查找数据的IO操作。 红黑树:平衡二叉树。随着数据量增大,树的高度也会变高。2的N次方=数量量(假设100万),那么N至少也是50,那么树的高度也是50,如果数据在子叶节点上,那么至少要经过50次的IO操作,才能找到数据。 HASH:散列表结构,key不适合排序,而且数据是散列的分布的,不利于IO读写。 BTree:一个节点上,横向扩展。即一个节点上,可以存储多个元素(Degree),且每个元素,都可以有子节点,叫做多叉树。 度(Degree)-节点的数据存储个数 叶节点具有相同深度 叶节点的指针为空 节点中的数据KEY从左至右递增排列 以5阶B树举例 B+Tree(Btree变种) 非叶子节点不存储data,只存储key,可以增大度(Degree)-节点的数据存储个数 叶子节点不存储指针 叶子节点增加了顺序访问指针,提高区间访问的性能 以5阶B+树举例 问题:Btree和B

【转载】MySQL数据库面试题

落爺英雄遲暮 提交于 2019-11-27 08:41:34
一,对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题: a)、索引的目的是什么? 快速访问数据表中的特定信息,提高检索速度 创建唯一性索引,保证数据库表中每一行数据的唯一性。 加速表和表之间的连接 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间 b)、索引对数据库系统的负面影响是什么? 负面影响: 创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。 c)、为数据表建立索引的原则有哪些? 在最频繁使用的、用以缩小查询范围的字段上建立索引。 在频繁使用的、需要排序的字段上建立索引 d)、 什么情况下不宜建立索引? 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。 二,简述在MySQL数据库中MyISAM和InnoDB的区别 区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。 InnoDB与MyISAM的区别: InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用

mysql数据库优化

别等时光非礼了梦想. 提交于 2019-11-27 08:13:56
1.表设计 遵循三范式,但必要的时候做数据冗余,举例说明:在权限模型中可能会用到5张表 用户表、角色表、权限表,还有用户角色关联表和角色权限关联表。如果此时要通过用户查询权限则必须关联查询或者使用多条sql查询,此时可以在用户表增加一个字段来存储用户的权限(例如将权限值使用逗号隔开),这样可以如果查询某用户的权限可以直接在用户表中查询,查询后再用程序来处理。 设计表时要选用合适的存储引擎,对于经常查询的表,并且不需要事务等应用,优先选用MyISAM(例如新闻表),如果需要事务处理对稳定性要求高的表优先选用InnoDB存储引擎(例如订单表,订单商品表),目前InnoDB已经成为新版MySQL的默认存储引擎,在高并发写入时的稳定性相比MyISAM更高,在读取速度上速度也比较快,所以推荐使用此引擎。 不需要永久保存的数据可以选用Memory存储引擎(例如session,购物车) 对于不同的字段选用合适的字段类型,例如IP地址应该存储为整型,见 将IP以整型的方式存储到数据库中 。固定长度的字符串要使用char,例如md5加密的密码。 2.分表技术 横向分表(各个表的字段类型与数量是完全一致的),例如用户表,可以按用户首字母横向切分;交易记录可以按照年份或者月份切分,每张表的字段一致,至于按什么规则来来区分可以看具体的业务。 纵向分表(各个表的字段不一致,但条数是一致的)

myisam place table-lock on table even when dealing with 'select' query?

家住魔仙堡 提交于 2019-11-27 07:57:42
问题 i am reading the book High Performance MySQL , it mentions: performing one query per table uses table locks more efficiently: the queries will lock the tables invididually and relatively briefly, instead of locking them all for a longer time. MyISAM places table-lock even when selecting something? can someone explain a little bit? 回答1: MyISAM has different kinds of locks. A SELECT operation places a READ LOCK on the table. There can be multiple active read locks at any given time, as long as

mysql error 'TYPE=MyISAM'

馋奶兔 提交于 2019-11-27 07:57:34
Below query I'm executing in Ubuntu 12, MySQL 5.1 version and receiving error as mentioned: CREATE TABLE mantis_config_table ( config_id VARCHAR(64) NOT NULL, project_id INTEGER NOT NULL DEFAULT 0, user_id INTEGER NOT NULL DEFAULT 0, access_reqd INTEGER DEFAULT 0, type INTEGER DEFAULT 90, value LONGTEXT NOT NULL, PRIMARY KEY (config_id, project_id, user_id) ) TYPE=MyISAM; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM' at line 9 Can anyone suggest what's wrong? Replace TYPE=MyISAM with ENGINE

关于MYSQL四种引擎

吃可爱长大的小学妹 提交于 2019-11-27 06:01:08
你能用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MYSQL。在缺省情况下,MYSQL支持三个引擎:ISAM、MYISAM和HEAP。另外两种类型INNODB和BERKLEY(BDB),也常常可以使用。 ISAM   ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。 MYISAM   MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MYISAM还有一些有用的扩展,例如用来修复数据库文件的MYISAMCHK工具和用来恢复浪费空间的MYISAMPACK工具。 MYISAM强调了快速读取操作,这可能就是为什么MYSQL受到了WEB开发如此青睐的主要原因

Mysql类

混江龙づ霸主 提交于 2019-11-27 05:54:07
架构层面可以采用读写分离,主从复制等等,在数据库前端加cache,如memcache,用于用户登录,商品查询 1.mysql优化的原则是什么? 答: 1.mysql的优化首先要从设计表的过程中就要做到合理规划,表的字段,尽量精确,比如能用char就不要用varchar,能用tinyint就不要用int。 2.索引的添加要适当,需要添加的地方就添加,不需要添加的地方就不要添加 3.读写尽量分离 4.编写存储过程的时候尽量不要用select * 5.mysql服务器硬件的配置尽量高点 6.选择合适的mysql引擎 2.你有做过哪些mysql的优化? 必做的2个优化: long_query_time = 2 lower_case_table_names = 1 因为默认mysql慢查询默认定义的时间是10s,这样还是有点高,所以我通常会修改其为2s,lower_case_table_names的作用是不区分大小写,通常也会开启,然后其他的会根据具体情况去进行优化:比如 当你发现mysql日志中 Too Many Connections 的错误提示,则需要增大max_connections的值 当你的物理内存比较大,而磁盘IO又比较高的时候可以适当增大table_cache的值 如果你的表是myisam表,可以适当设置key_buffer_size的值,你可以通过show