loannes's blog

标签 · MySQL

首页

关于

归档

loading..
MySQLMySQL锁,InnoDB

浅谈MySQL中的锁

前言 之前学习了MySQL的事务管理MySQL管理事务处理 在数据库处理高并发的时候需要涉及到事务管理和锁的机制问题这两块知识。对于锁的处理一直是一个老生常谈的话题,内容太过复杂。这次借助这篇文章分享下我对Innodb中的锁的机制的理解。 快照读与当前读 在了解锁的机制前我们得先了解快照读与当前读的区别。 一般我们常用的select * from ...也是读,共享锁那也是读,它们之间有什么区别呢?其实MySQL中的读与事务隔离级别中的读是不同的读。 在 MVCC 并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。 快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读,读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,..

更多
loading..
MySQL

【MySQL】浅谈MySQL的LOAD DATA

前言 好久没碰MySQL了,这次碰巧在研究superset的时候需要将一份csv格式的数据文件导入到数据库中。正好借此机会可以重温下MySQL。 数据来源 网盘密码 : g5xa 开发环境 Mac OS 10.13 MySQL 8.0 准备工作 在开始之前需要对源数据做一次清洗: 去除”,“等影响数据导入的符号 去除第一行索引值,因为它不是数据 如果需要咋数据库中加上id,那么为了对应在源数据中也要加上,excel中加上id还是很方便的。 把数据转为utf-8格式的csv文件 在这之前先简单阅读下官方文档:MySQL Documentation 可以很方便的找到LOAD DATA的表达式: LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] ..

更多
loading..
MySQL触发器

【MySQL必知必会】使用触发器

触发器 当某个表发生更改时需要MySQL自动处理事件就是触发器。MySQL只会响应以下语句从而自动执行一条MySQL语句: DELETE INSERT UPDATE 创建触发器 创建触发器时,需要注意一些细节: 唯一的触发器名 触发器关联的表 触发器应该响应的活动(DELETE,INSERT,UPDATE) 触发器何时执行(处理之前或之后) 在MySQL5中同一数据库中的两个表可以用同一个名字,但是同一个表中的触发器名字必须唯一。但是在DBMS数据库中触发器名只能唯一。 可以用CREATE TRIGGER语句创建触发器。 CREATE TRIGGER test_tt AFTER DELETE ON `test` FOR EACH ROW BEGIN DECLARE s VARCHAR(20)..

更多
loading..
MySQL游标

【MySQL必知必会】使用游标

游标 由于MySQL检索返回的是一组成为结果集的行,可能是零行也可能是多行,但是之前学到的并没有能一行一行处理的方式。而有时候需要需要在检索出来的行中前进、后退一行或多行,这个时候需要使用游标。 游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览过更改。 游标在MySQL中只能用于存储过程或者函数 使用游标的流程 在能够使用游标前,必须声明它。为了定义要使用的SELECT语句。 声明游标后需要打开游标。这个过程用SELECT语句把数据实际检索出来。 对于填有数据的游标,根据需要检索出各行。 结束游标需要关闭它 打开和关闭游标 打开:OPEN CURSOR 关闭: CLOSE CURSOR CURSOR指的是先前定义的游标名 如一个完整的打开关闭过程: CREATE PROCED..

更多
loading..
MySQL存储过程

【MySQL必知必会】使用存储过程

存储过程 存储过程简单来说就是为以后的使用而保存的一条或多条MySQL语句集合。这里可以理解为在实际项目中,可能会遇到不同逻辑的MySQL,这个时候需要把这些语句集合起来,相当于是一个文件。 为什么使用存储过程 通过把处理封装在容易使用的单元中,简化复杂的操作。 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果所有开发人员和应用程序都使用同一存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。 简化对变动的管理。如果表名、列名或业务逻辑有变化,只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。 提高性能。因为使用存储过程比使用比使用单独的SQL语句要快。 存在一些只能用在单个请求中的MySQL元素和特性..

更多
loading..
MySQL视图

【MySQL必知必会】使用视图

视图 以例子来说明: SELECT salaries.emp_no, dept_emp.dept_no, salary, dept_name FROM salaries, dept_emp, departments WHERE salaries.emp_no = dept_emp.emp_no AND dept_emp.dept_no = departments.dept_no AND salary = 158220; 从三张表中获取薪水为158220的员工的id,部门id,薪水和部门名称。 如果使用视图,这段语句就会变成: SELECT salaries.emp_no, dept_emp.dept_no, salary, dept_name FROM salary_for_department WHE..

更多
loading..
MySQL全文本搜索

【MySQL必知必会】全文本搜索

理解全文本搜索 之前学习到了用LIKE关键字,利用通配符来匹配文本,还有通过正则表达式来匹配文本。不过这些匹配都有些缺点: 性能:通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行。如果搜索行越长匹配就越耗时。 明确控制:通配符和正则表达式很难做到精细的控制,控制在匹配过程中哪些需要匹配哪些需要不匹配,这样会影响性能无法做到优化。 智能化结果:基于通配符和正则表达式的匹配得到的结果你无法控制匹配数量,比方说匹配的关键词是#,在匹配的全文中有多个#,但是我无法控制结果中只返回一个或者n个。 而这些限制都能通过全文本搜索来解决。 使用全文本搜索 一般在建表时启用全文本搜索。 MySQL最常用的两个引擎为MyISAM和InnoDB MyISAM:支持全文索引 InnoDB:不支持全文索引 CREAT..

更多
loading..
MySQL组合查询

【MySQL必知必会】组合查询

组合查询的使用场景 在单个查询中从不同的表返回类似结构的数据 对单个表执行多个查询,按单个查询返回数据 创建组合查询 可以通过UNION操作符来组合多条SQL查询 查询emp_no为10010以及薪水大于150000的员工 SELECT emp_no,salary FROM salaries WHERE salary > 150000 UNION SELECT emp_no, salary FROM salaries WHERE emp_no = 10010; 输出: +--------+--------+ | emp_no | salary | +--------+--------+ | 43624 | 151115 | | 43624 | 153166 | | 43624 | 153..

更多
loading..
MySQL高级联结

【MySQL必知必会】创建高级联结

使用不同类型的联结 上次学到的是等值联结,也是最简单的联结。这次要学习其它三种联结:自联结,自然联结和外部联结。 自联结 id为10031的员工薪水漏发了,需要确认下这个部门的所有员工,利用自联结的方法找出该部门所有员工的emp_no。 方案一: 子查询 SELECT emp_no FROM dept_emp WHERE dept_no = (SELECT dept_no FROM dept_emp WHERE emp_no = '10031') LIMIT 10 输出: +--------+ | emp_no | +--------+ | 10001 | | 10006 | | 10008 | | 10012 | | 10014 | | 10018 | | 10021 | | 1002..

更多
loading..
MySQL子查询

【MySQL必知必会】使用子查询

利用子查询进行过滤 简单来说将就是利用一条SELECT语句的返回结果用于另一条WHERE语句的WHERE子句 比方说查询薪水高于150000的员工全名。这里需要查询2张表,先分开写看下 SELECT emp_no,salary FROM salaries WHERE salary > 150000; 输出: +--------+--------+ | emp_no | salary | +--------+--------+ | 43624 | 151115 | | 43624 | 153166 | | 43624 | 153458 | | 43624 | 157821 | | 43624 | 158220 | | 46439 | 150345 | | 47978 | 151929 ..

更多
12