MyISAM

MySQL数据库的常用索引

╄→гoц情女王★ 提交于 2020-08-18 05:42:11
MySQL数据库的常用索引 本文关键字:数据库、MySQL、索引的作用、常用索引 在使用数据库的过程中,经常会进行数据的查询。随着数据量的增大,查询的时间会变的原来越长,这就需要合理的建立索引来提高查询效率。 一、索引概述 1. 数据库检索 在讲述索引之前我们要先来简单介绍一下数据库中是如何进行数据查询的,这更有助于我们理解索引。对于数据库来说,本质上是一个软件,或者可以称为一个系统,提供了对于数据管理的功能。存放在数据表中的数据其实同样是存储在磁盘上,对于不同的数据库,会以不同的数据格式文件存在。 在进行数据库检索时,尤其是条件查询,解析SQL指令后,本质上是对数据存储文件的扫描。我们所使用的绝大部分关系型数据库的表结构采用的都是行式存储,也就是一条数据是一行,每一列的数据是在这一行中以某种分隔符来分隔。数据库在进行数据扫描时也是通过游标(cursor)以行为单位来进行操作,与之相对的就是列式存储(column table),比如HANA。 那么在进行条件查询时,会逐行进行扫描,通过移动游标指定到不同的行,然后再获取到对应的列的值,比对,确定结果,在数据量比较小的时候我们可以忽略时间问题,但当数据量很大时(千万级)问题就很明显了,查询速度很难接受,在使用索引前,数据查询的过程可以这样表示: 2. 索引的作用 说到索引,大家一定都很熟悉目录,如果我们把数据表看成一本书的话

面试题千变万化,为什么总是会问MySQL?

谁说胖子不能爱 提交于 2020-08-18 05:33:48
前言 当你简历上写了 熟悉mysql关系型数据库时,那肯定免不了面试官对于myql索引.事务,慢查询等等的考察 那么到底什么是索引,索引的数据类型有哪些,它们的优缺点以及如何去排查那些慢SQL语句等,虚都莫虚,下面都给各位安排安排 面试开始 面试官 : 我看你简历上写了熟悉mysql,那谈谈你是如何筛选出慢mysql语句呢? 是它,是它,就是它,慢查询日志,这个时候你肯定要把主动权掌握在自己手里了,只要面试官不说停,谁拉我都绝对不能停下来的 深吸一口气,开始你对面试官最深情的告白 首先可以先通过 show variables like ‘slow_query%’ 来确定慢查询是否开启,如果没有则通过 set global slow_query_log=‘ON’ 开启慢查询 其次我们可以设置慢查询日志的位置( set global slow_query_log_file )和设置超过多少秒( set global long_query_time )记录下慢sql, 这样就可以在指定的目录下查看日志,从而找出慢sql语句. 这个时候好像第一个问题已经回答完了,但是停是不可能停下来的,一辈子都不可能 慢sql的原因有很多,其中典型的就是表的数据量太大,查询的时候走了全表查询从而导致查询时间长,这个时候我们可以给一些数据量大的表添加索引,当然也可以通过 set global log

MySQL语句和命令大全

倾然丶 夕夏残阳落幕 提交于 2020-08-17 21:07:43
一、用户连接、创建、权限、删除 1. 连接MySQL操作 mysql -h 主机地址 -u 用户名 -P端口号 -p 使用 SSL 连接 mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h主机地址 -u用户名 -p 2. 创建用户 CREATE USER 'username'@'host' IDENTIFIED BY 'password'; host 指定该用户在哪个主机上可以登陆,如果是本地用户可用 localhost , 如果想让该用户可以从任意远程主机登陆,可以使用通配符 % . 3. 授权 GRANT [all privileges/某个权限] ON databasename.tablename TO 'username'@'host'; 如果想让该用户可以授权,用以下命令: GRANT all privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; 4. 锁定用户 ALTER USER 'username'@'host' ACCOUNT LOCK; 解锁 ALTER USER 'username'@'host' ACCOUNT UNLOCK; 常见场景 : 1

MySQL备份策略

走远了吗. 提交于 2020-08-17 12:52:46
1 关于备份 1.1 为什么要备份 灾难恢复 ,数据库在运行过程中,终会遇到各种各样的问题: 硬件故障、Bug 导致数据损坏、由于服务器宕机或者其他原因造成的数据库不可用。除此以外还有人为操作: DELETE 语句忘加条件、 ALTER TABLE 执行错表、 DROP TABLE 执行错表、黑客攻击,即使这些问题你都还没遇到,但是根据墨菲定律,总会有遇上的时候。 回滚 ,由于某种Bug或系统被黑造成大量的损失,这个时候就需要回滚到某个状态。常见的有区块链交易所被黑然后回滚,游戏漏洞被利用然后整体回滚。 审计 ,有时候有这样的需求:需要知道某一个时间点的数据是怎么样的,可能是年末审计,也可能是因为官司。 测试 ,一个基本的测试需求是,定时拉取线上数据到测试环境,如果有备份,就可以非常方便地拉取数据。 1.2 有哪些备份方式 1.2.1 逻辑备份 逻辑备份是最常见的方式,在数据量比较少的时候很常用。 逻辑备份的优势: 备份恢复比较简单,例如 mysqldump 就是 MySQL 自带的备份工作,无需额外安装。恢复的时候可以直接使用 mysql 命令进行恢复。 可以远程备份和恢复,也就是说,可以在其他机器执行备份命令。 备份出来的数据非常直观,备份出来后,可以使用 sed grep 等工具进行数据提取或者修改。 与存储引擎无关,因为备份文件是直接从 MySQL 里面提取出来的数据

大家都说mybatis会自动回滚事务(如果增删改没有提交事务的话,不会写入到数据库中),为什么我没有?

瘦欲@ 提交于 2020-08-17 12:38:46
问题 今天复习一下mybatis,看到别人说事务自己也去了解一下 他们都说 mybatis增删改需要手动提交事务 ??? 我看了一下自己的代码?我没有写提交啊?但是我的测试结果?和数据库查看结果都是成功的?有写入到数据库啊!!! 那为什么到我这里不 需要提交事务 ?好奇的我想要去了解 猜想1 既然数据库需要手动提交事务,那肯定有 自动提交事务 难道是我在这里被设置为自动提交事务了? 马上查看代码 private static SqlSessionFactory sqlSessionFactory ; static { try { String resource = "mybatis-config.xml" ; InputStream inputStream = Resources . getResourceAsStream ( resource ) ; sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream ) ; } catch ( Exception e ) { e . printStackTrace ( ) ; } } public static SqlSession getSqlSEssion ( ) { return sqlSessionFactory . openSession

MySQL基础知识

僤鯓⒐⒋嵵緔 提交于 2020-08-17 12:05:09
Mysql常用存储引擎 存储引擎 锁 事务 外键 空间数据 性能 索引类型 MyISAM 表级锁 不支持 不支持 支持 高 非聚集索引 InnoDB 行锁、页锁、表级锁 支持 支持 不支持 低 主键为聚集索引,其他为辅助索引 事务 事务是逻辑上的⼀组操作,要么都执⾏,要么都不执⾏。 事务四大特性 原⼦性( Atomicity ): 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么完全不起作⽤; ⼀致性( Consistency ): 执⾏事务前后,数据保持⼀致,多个事务对同⼀个数据读取的结果是 相同的; 隔离性( Isolation ): 并发访问数据库时,⼀个⽤户的事务不被其他事务所⼲扰,各并发事务 之间数据库是独⽴的; 持久性( Durability) ⼀个事务被提交之后。它对数据库中数据的改变是持久的,即使数据 库发⽣故障也不应该对其有任何影响。 并发事务带来的问题 脏读(Dirty read): 当前事务读到了T1事务未提交的数据,然后T1事务回滚,这个数据就是一个脏数据 不可重复读(Unrepeatableread):当前事务第一次查询没有数据,这是T1事务提交了一条数据,当前事务再次查询,却查到了这次数据,在一次事务中读到的数据不一致 幻读(Phantom read):幻读和不可重复度类似,它发⽣在⼀个事务(T1)读取了⼏⾏数据,接着另

MySQL数据恢复

江枫思渺然 提交于 2020-08-17 08:38:17
1 前言 数据恢复的前提的做好备份,且开启 binlog , 格式为 row 。如果没有备份文件,那么删掉库表后就真的删掉了, lsof 中还有记录的话,有可能恢复一部分文件,但若刚好数据库没有打开这个表文件,那就只能跑路了。如果没有开启 binlog ,那么恢复数据后,从备份时间点开始的数据都没得了。如果 binlog 格式不为 row ,那么在误操作数据后就没有办法做闪回操作,只能老老实实地走备份恢复流程。 2 直接恢复 直接恢复是使用备份文件做全量恢复,这是最常见的场景 2.1 mysqldump备份全量恢复 使用 mysqldump 文件恢复数据非常简单,直接解压了执行 gzip -d backup.sql.gz | mysql -u<user> -h<host> -P<port> -p 2.2 xtrabackup备份全量恢复 恢复过程 # 步骤一:解压(如果没有压缩可以忽略这一步) innobackupex --decompress <备份文件所在目录> # 步骤二:应用日志 innobackupex --apply-log <备份文件所在目录> # 步骤三:复制备份文件到数据目录 innobackupex --datadir=<MySQL数据目录> --copy-back <备份文件所在目录> 2.3 基于时间点恢复 基于时间点的恢复依赖的是 binlog 日志

MySql自增主键ID重置这个坑货

二次信任 提交于 2020-08-17 05:55:39
这两天在面试的时候被问到一个问题:在mysql中用自增列作为主键时,先往表里插入5条数据,此时表里数据id为1、2、3、4、5,如果此时删除id=4、5的数据后,再重启数据库,重启成功后向表里insert数据的时候,INNODB、MyISAM引擎下ID分别是从几开始增加?当时被问到这个问题时,一脸懵逼,MD谁有事没事去重启线上数据库嘛。最后还是基础知识不牢固,在此作个笔记。 MySQL通常使用的引擎都是INNODB,在建表时,一般使用自增列作为表的主键,这样的表对提高性能有一定的帮助。但是自增列有一个坑,并且这个坑存在了很久,一直到MySQL 8.0版本,才修复了这个坑,这个坑就是表的自增列变量auto_increment在MySQL重启后,有可能丢失。 innodb引擎(低版本):Innodb表中把自增列作为主键ID时,自增列是通过auto-increment计数器实现的,计数器的最大值是记录到内存中的,重启数据库后,会导致auto-increment计数器重置,从而会导致主键ID重置。 MyISam引擎:MyISAM表会把自增列(auto-increment计数器)最大值是记录到数据文件里,重启MySQL自增列(计数器)最大值不会丢失,从而使用自增列作为主键ID时也不会丢失。 1.innodb主键重置问题 在 MySQL低版本中,InnoDB表中使用自增的 auto

MySQL LOAD DATA INFILE—批量从文件(csv、txt)导入数据

|▌冷眼眸甩不掉的悲伤 提交于 2020-08-17 04:35:21
最近做的项目,有个需求(从Elastic Search取数据,业务运算后),每次要向MySQL插入1300万条数据左右。最初用MySQL的executemany()一次插入10000条数据,统计的时间如下: 如上,插入时间由于系统的IO变化,会有波动,最快在4秒左右。 后改为"load data infile"大概,10万条数据平均1秒~1.5秒,实际的代码示例如下: query = " LOAD DATA INFILE '/var/lib/mysql-files/es.csv' INTO TABLE g_visit_relation_asset_temp FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES \ (srcip, srcport, dstip, dstport, l7p, @dummy, cnt, @dummy, cnt_date) " mysqlcur.execute(query) mysqlconn.commit() 说明: (1) MySQL需要开启对"load data inflie"的权限支持 mysqlcur.execute("SET GLOBAL local_infile = 1") (2) 需要对mysql文件目录(笔者: “/var/lib/my-files/”

用了这么多年MySQL,这些好习惯你用过哪些

我的未来我决定 提交于 2020-08-17 02:31:22
新建表和字段建议 **1、**所有数据表和字段要有清晰的注释,字段说明 说明:不管是创建者还是其他开发或者后续维护者都能清楚知道数据表和字段定义的含义 **2、**表名、字段名使用小写字母或数字,禁止出现数字开头 说明:MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写,为了避免出现不必要的麻烦,统一使用小写 **3、**每个列都设置为not null(如果列为BLOB/TEXT类型的,则这个列不能设置为NOT NULL),且定义默认值 说明:3.1:NOT IN、!= 等负向条件查询在有 NULL 值的情况下返回非空行的结果集 3.2:使用 concat 函数拼接时,首先要对各个字段进行非 NULL 判断,否则只要任何一个字段为空都会造成拼接的结果为 NULL 3.3:当用count函数进行统计时,NULL 列不会计入统计 3.4:因为NULL的列使得索引,索引统计和值比较都更复杂,可为NULL的列会使用更多的存储空间,在mysql里也需要特殊处理,当可为NULL的列被索引时,每个索引记录需要一个额外的字节,如果计划在列上建索引,应该避免将列设计为NULL。 **4、**每个表有自增列id且为主键,使用无符号类型unsigned,不作业务逻辑使用 说明: 4.1:避免存储负值,且扩大了表示范围 4.2:如果使用非自增主键(如果身份证号或学号等)