MyISAM

MySql逻辑结构简介

给你一囗甜甜゛ 提交于 2019-12-03 11:16:43
上篇文章《 MySql逻辑结构简介 》我们聊到了存储引擎,可以说MySQL可插拔的多元化存储引擎给我们的使用者带来了很灵活的选择。 这篇文章我们来聊一下目前主流的两种存储引擎MyISAM和InnoDB的区别。 MyISAM InnoDB 外键 不支持 支持 事务 不支持 支持 锁表 表锁,即使操作一条记录也会锁住整个表, 不适合高并发的操作 行锁,操作时只锁某一行,不对其它行有影响, 适合高并发的只操作 缓存 只缓存索引, 不缓存真实数据 不仅缓存索引还 要缓存真实数据 ,对内存要求较高,而且内存大小对性能有决定性的影响 占用空间 表空间占用 小 表空间占用 大 关注点 性能 ,查询速度快 事务 阿里巴巴,淘宝用哪个? 前期 :阿里巴巴大部分MySQL数据库其实使用的是Percona的Xtradb原型加以修改。 Percona公司为MySQL数据库服务器进行了改进,新建了一款存储引擎叫Xtradb,这款存储引擎从性能上完全可以替代Innodb,在功能和性能上较MySQL有着很显著的提升, 该版本提升了在高负载情况下的InnoDB的性能,为DBA提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。 现在 :2016年云栖大会·北京峰会上,阿里云 宣布启动了 AliSQL、AliRedis 开源项目, AliSQL 是基于MySQL官方版本的一个分支

mysql全局变量和局部变量

风流意气都作罢 提交于 2019-12-03 11:12:22
全局变量和局部变量 在服务器启动时,会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值)。然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。 举一个例子,在服务器启动时会初始化一个名为default_storage_engine,作用范围为GLOBAL的系统变量。之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个名为default_storage_engine,作用范围为SESSION的系统变量,该作用范围为SESSION的系统变量值按照当前作用范围为GLOBAL的同名系统变量值进行初始化。 很显然,通过启动选项设置的系统变量的作用范围都是GLOBAL的,也就是对所有客户端都有效的,因为在系统启动的时候还没有客户端程序连接进来呢。了解了系统变量的GLOBAL和SESSION作用范围之后,我们再看一下在服务器程序运行期间通过客户端程序设置系统变量的语法: SET [GLOBAL|SESSION] 系统变量名 = 值; 或者写成这样也行: SET [@@(GLOBAL|SESSION).]var_name = XXX; 比如我们想在服务器运行过程中把作用范围为GLOBAL的系统变量default_storage_engine的值修改为MyISAM

mysql面试题

会有一股神秘感。 提交于 2019-12-03 10:38:32
1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 2、MySQL中myisam与innodb的区别,至少5点 (1)、问5点不同; (2)、innodb引擎的4大特性 (3)、2者selectcount(*)哪个更快,为什么 3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1)、varchar与char的区别 (2)、varchar(50)中50的涵义 (3)、int(20)中20的涵义 (4)、mysql为什么这么设计 4、innodb的事务与日志的实现方式 (1)、有多少种日志; (2)、事物的4种隔离级别 (3)、事务是如何通过日志来实现的,说得越深入越好。 5、问了MySQL binlog的几种日志录入格式以及区别 (1)、binlog的日志格式的种类和分别 (2)、适用场景; (3)、结合第一个问题,每一种日志格式在复制中的优劣。 6、问了下MySQL数据库cpu飙升到500%的话他怎么处理? (1)、没有经验的,可以不问; (2)、有经验的,问他们的处理思路。 7、sql优化 (1)、explain出来的各种item的意义; (2)、profile的意义以及使用场景; 8、备份计划,mysqldump以及xtranbackup的实现原理 (1)、备份计划; (2)、备份恢复时间; (3)

事务、视图、触发器、存储过程、函数、备份

你离开我真会死。 提交于 2019-12-03 07:47:05
目录 事务 基本原理: 使用方法 事务的特性 存储引擎 视图 触发器 存储过程 函数 数据库备份 事务 事务是什么 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言书写的用户程序的执行所引起。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。 通俗来讲,事务指一组操作,要么都执行成功,要么都执行失败。 基本原理: Mysql允许将事务统一进行管理(存储引擎INNODB),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到用于确认结果之后再进行操作。 使用方法 start transaction; sql 语句 commit(成功提交)/rollback(回滚,清空操作); 例子: --模拟银行转账 --先准备数据 create table user( id int auto_increment primary key, name varchar(32) not null default '', salary int not null default 0 )charset utf8; insert into user(name,salary) values ('cwz',1000),('张三',2000); -

mysql面试题三

帅比萌擦擦* 提交于 2019-12-03 07:23:44
1、MySQL的复制原理以及流程 (1)、复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 3. 从:sql执行线程——执行relay log中的语句; (2)、MySQL复制的线程有几个及之间的关联 MySQL 的复制是基于如下 3 个线程的交互( 多线程复制里面应该是 4 类线程): 1. Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到slave; 2. Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log; 3. Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行; 4. 如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的真正的多线程复制, SQL 线程只做 coordinator,只负责把 relay log 中的 binlog读出来然后交给 worker 线程, woker 线程负责具体 binlog event 的执行; (3)

InnoDB vs. MyISAM insert query time

匆匆过客 提交于 2019-12-03 06:31:53
I have a large MySQL table (~10 Million Rows, 6.5G) Which i use for read & write. It is MyISAM, and i get a lot of locks due to MyISAM's all table lock on writes. I decided to try and move to InnoDB which is recommended for read/write tables, and it locks only specific rows on writes. After converting, I tested insert statements, and it turns out it takes ~15 times more (from 0.1 sec to 1.5 sec) in the InnoDB table than in the MyISAM table. Why is that? I haven't configured anything for InnoDB yet, and plan to add partitions also, but this figure is still unexpected for me. Of course the

Are there any pitfalls / things you need to know when changing from MyISAM to InnoDB

China☆狼群 提交于 2019-12-03 05:19:20
问题 One of my projects use the MyISAM engine in MySQL, but I'm considering changing it to InnoDB as I need transaction support here and there. What should I look at or consider before doing this? Can I just change the engine, or should the data be prepared for it? 回答1: Yes absolutely, there are many things, you should test your application extremely thoroughly: Transactions can deadlock and need to be repeated. This is the case (in some circumstances) even with an autocommitted transaction which

SQL数据库常见问题解答及万能密码注入原理讲解[图]

会有一股神秘感。 提交于 2019-12-03 05:03:20
SQL数据库常见问题解答及万能密码注入原理讲解[图] 【万能密码】的原理 用户进行用户名和密码验证时,网站需要查询数据库。查询数据库就是执行SQL语句。针对此BBS论坛,当用户登录时,后台执行的数据库查询操作(SQL语句)是【Selectuser id,user type,email From users Where user id=’用户名’ And password=’密码’】 由于网站后台在进行数据库查询的时候没有对单引号进行过滤,当输入用户名【admin】和万能密码【2’or’1】时,执行的SQL语句为【Select user id,user type,email From users Whereuser id=’ admin’ And password=’ 2’or1】。同时,由于SQL语句中逻辑运算符具有优先级,【=】 优先于【and】,【and】 优先于【or】,且适用传递性。因此,此SQL语句在后台解析时,分成两句【Select user id,user type,emall From users Where user id=’ admin Andpassword=’2’ 】和【’1’ 】 两句bool值进行逻辑on运算,恒为TRUE。SQL语句的查询结果为TRUE,就意味着认证成功,也可以登录到系统中。 1.数据库索引失效的场景: 应尽量避免在 where

SQL引擎及事务支持

北慕城南 提交于 2019-12-03 04:53:47
查看当前表引擎 SHOW CREATE TABLE table_name MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。 更改MyISAM类型表为InnoDB类型的表 ALTER TABLE table_name ENGINE=InnoDB; ALTER TABLE table_name ENGINE=MyISAM; 一次修改多个表 #修改为InnoDB SELECT CONCAT( 'ALTER TABLE ', TABLE_NAME, ' ENGINE=InnoDB;' ) FROM information_schema.tables WHERE table_schema = 'DBNAME' LIMIT 0 , 10000;#修改为MyISAM SELECT CONCAT( 'ALTER TABLE ', TABLE_NAME, ' ENGINE=MyISAM;' ) FROM information_schema.tables WHERE table_schema = 'DBNAME' LIMIT 0 , 10000; 使用说明: 1. 将以上SQL语句中的 DBNAME 替换成需要修改的数据库名称。 2.

How to test an SQL Update statement before running it?

为君一笑 提交于 2019-12-03 04:00:44
问题 In some cases, running an UPDATE statement in production can save the day. However a borked update can be worse than the initial problem. Short of using a test database, what are options to tell what an update statement will do before running it? 回答1: In addition to using a transaction as Imad has said (which should be mandatory anyway) you can also do a sanity check which rows are affected by running a select using the same WHERE clause as the UPDATE. So if you UPDATE is UPDATE foo SET bar =