MyISAM

MySQL 中什么情况会导致自增主键不能连续?

我们两清 提交于 2020-05-05 13:34:50
简单点说: 以下情况会导致 MySQL 自增主键不能连续: 唯一主键冲突会导致自增主键不连续; 事务回滚也会导致自增主键不连续 。 相关面试题总结如下: 一:自增主键是连续的么?   - 自增主键不能保证连续递增。 二:自增值保存在哪里?  当使用 show create table `table_name`;时,会看到 自增值,也就是 AUTO_INCREMENT。 CREATE TABLE `t` ( .... ) ENGINE =InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;  这个输出结果容易引起这样的误解:自增值是保存在表结构定义里的。  实际上,表的结构定义存放在后缀名为.frm 的文件中, 但是并不会保存自增值 。 三:不同的引擎对于自增值的保存策略不同。    1)MyISAM 引擎     - 自增值保存在数据文件中 。    2)InnoDB 引擎      保存在了内存里 ,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为 MySQL 重启前的值”。     过程       在 MySQL 5.7 及之前的版本,自增值保存在内存里,并没有持久化。       每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将

MySQL自增列(AUTO_INCREMENT)相关知识点总结

我的未来我决定 提交于 2020-05-05 13:34:14
MySQL的自增列(AUTO_INCREMENT)和其它数据库的自增列对比,有很多特性和不同点(甚至不同存储引擎、不同版本也有一些不同的特性),让人感觉有点稍微复杂。下面我们从一些测试开始,来认识、了解一下这方面的特殊知识点: 自增列持久化问题 如果一个表拥有自增列,当前最大自增列值为9, 删除了自增列6、7、8、9的记录,重启MySQL服务后,再往表里面插入数据,自增列的值为6还是10呢? 如果表的存储引擎为MyISAM呢,又会是什么情况? 下面实验环境为MySQL 5.7.21 mysql> drop table if exists test; Query OK, 0 rows affected (0.08 sec) mysql> create table test(id int auto_increment primary key, name varchar(32)) ENGINE=InnoDB; Query OK, 0 rows affected (0.02 sec) mysql> insert into test(name) -> select 'kkk1' from dual union all -> select 'kkk2' from dual union all -> select 'kkk3' from dual union all -> select

.NET和PHP程序员如何通过技术快速变现

让人想犯罪 __ 提交于 2020-05-05 01:13:51
刚开始写博客不足之处望大家多多指点,少一些质疑多一些帮助,我们就能成为朋友。 上一篇:《 .NET程序员我是如何通过一个产品在2年内买车买房 》有很多同为程序员的小伙伴们给我留言,从整体的留言中我能看到有很多迷茫的小伙伴活在上班拿工资的夹缝中,首先能挣到外快固然是好,如没有挣到还是努力把自己的事做好,成功并非都是顺理成章而是偶然,能通过从事技术这份工作抓住机会才是你职场中应该学的,比如:你的每一任老板都是一个商机,他是怎么做的你也可以这样做,为什么不能,应该是执行力不够,上一篇我也讲到过我通过自媒体平台连续每天发文长达2-3个月,其中这个过程就是一个漫长而又头疼的事,首先每天的文章该怎么写就单单这一件事都足以让你放弃100次。 本文大纲: 1.我热衷技术但我更倾向于技术变现 2.代码可以copy发现商机的方式也可以copy 3.具体执行细节 4.我的第二款产品现在正在这样做,不信你搜搜看 1.我热衷技术但我更倾向于技术变现 要想技术变现就必须广而告之,你做的再好没人知道,卖不出去也是一堆废代码,因为没有价值(钱),这里并非否认技术没价值,而是要让技术变的更有价值,让自己更有动力去学习技术,然后通过技术变现,通过技术在遇到实际情况的时候去解决,让问题去驱动学习,而不是学而不用,最后沦落成为纸上谈兵。 以下是我在解决投票系统 慢、卡 上面关于数据库的一些优化,有可能你并没有遇到过该问题

MySQL 千万级 数据库或大表优化

巧了我就是萌 提交于 2020-05-04 08:13:57
首先考虑如下因素: 1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节; 2.数据项:是否有大字段,那些字段的值是否经常被更新; 3.数据查询SQL条件:哪些数据项的列名称经常出现在WHERE、GROUP BY、ORDER BY子句中等; 4.数据更新类SQL条件:有多少列经常出现UPDATE或DELETE 的WHERE子句中; 5.SQL量的统计比,如:SELECT:UPDATE+DELETE:INSERT=多少? 6.预计大表及相关联的SQL,每天总的执行量在何数量级? 7.表中的数据:更新为主的业务 还是 查询为主的业务 8.打算采用什么数据库物理服务器,以及数据库服务器架构? 9.并发如何? 10.存储引擎选择InnoDB还是MyISAM? 大表优化考虑步骤: 第一优化你的sql和索引; 第二加缓存,memcached,redis; 第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360的atlas,其它的要么效率不高,要么没人维护; 第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑

【MySQL】EXPLAIN命令详解--解释执行计划

独自空忆成欢 提交于 2020-05-04 00:34:19
具体参考:    https://www.cnblogs.com/gomysql/p/3720123.html 原文如下: 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要通过EXPLAIN去完成。EXPLAIN命令是查看优化器如何决定执行查询的主要方法。可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。需要注意的是,生成的QEP并不确定,它可能会根据很多因素发生改变。MySQL不会将一个QEP和某个给定查询绑定,QEP将由SQL语句每次执行时的实际情况确定,即便使用存储过程也是如此。尽管在存储过程中SQL语句都是预先解析过的,但QEP仍然会在每次调用存储过程的时候才被确定。 通过执行计划可以知道什么? (root@yayun-mysql-server) [test]>explain select d1.age, t2.id from (select age,name from t1 where id in (1,2))d1, t2 where d1.age=t2.age group by d1.age, t2.id order by t2

【MySQL】性能优化之 Index Condition Pushdown

故事扮演 提交于 2020-05-02 18:25:45
一 概念介绍 Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。 a 当关闭ICP时,index 仅仅是data access 的一种访问方式,存储引擎通过索引回表获取的数据会传递到MySQL Server 层进行where条件过滤。 b 当打开ICP时,如果部分where条件能使用索引中的字段,MySQL Server 会把这部分下推到引擎层,可以利用index过滤的where条件在存储引擎层进行数据过滤,而非将所有通过index access的结果传递到MySQL server层进行where过滤. 优化效果:ICP能减少引擎层访问基表的次数和MySQL Server 访问存储引擎的次数,减少io次数,提高查询语句性能。 二 原理 Index Condition Pushdown is not used: 1 Get the next row, first by reading the index tuple, and then by using the index tuple to locate and read the full table row. 2 Test the part of the WHERE condition that applies to this

【MySQL】经验:索引使用场景

落爺英雄遲暮 提交于 2020-05-02 17:46:08
一、适合用索引的场景 1、主键 主键一般为id等具有唯一性标识的字段,需要频繁查找、连接。InnoDB中会自动为主键建立聚集索引,即使没有定义主键,也会自动生成一个隐藏主键建立索引;MyISAM中不会自动生成主键。建议给每张表指定主键。 2、频繁作为查询条件的字段 索引是以空间换时间的,某字段如果频繁作为查询条件,建议建立索引 3、查询中作为与其他表关联的字段(外键) 4、查询中常作为查询排序条件的字段 这里要注意,order by的字段出现在where条件中才能使用索引,否则索引失效。 5、查询中的统计、分组字段 group by和union也属于需要排序的操作,这里也要注意字段出现在where条件中才能使用索引,否则索引失效。 P.S.在高并发条件下倾向使用组合索引 二、不适合用索引的场景 1、频繁更新的字段、表 如果字段添加了索引,在更新时不仅要更新数据本身,还要维护其索引,如果频繁更新会带来很多额外开销。再者,如果一个表频繁进行增删改操作,也不适合索引 2、很少作为查询条件的字段 3、表的记录不多 一般数据量达到300万-500万时考虑建立索引。 4、数据重复且分布平均的字段 由于大量的重复,索引对性能的提升很有限,比如年龄、性别… 来源: oschina 链接: https://my.oschina.net/u/4341660/blog/4262316

MySQL数据库中库、表名、字段的大小写问题

廉价感情. 提交于 2020-05-02 10:20:13
MySQL数据库中库、表名、字段的大小写问题 原文出处: https://blog.csdn.net/andyliulin/article/details/83020934 在使用MySQL建库的过程中发现了一个问题,无论怎么创建库,创建出来的库名都是小写的。然后上网查了一下资料。 在MySQL中,数据库和表都是对应目录下的一个或多个文件。因此,操作系统的大小写是否敏感决定了数据库大小写是否敏感。而在Windows中是对大小写不敏感的(Linux是对大小写敏感的)。 下图是在windows操作系统上MySQL中lower_case_table_system和lower_case_table_names的默认值。 下图是在Linux操作系统上MySQL中lower_case_table_system和lower_case_table_names的默认值。 变量lower_case_file_system说明是否数据目录所在的文件系统对文件名的大小写敏感。ON说明文件名的大小写不敏感,OFF表示敏感。 lower_case_table_names参数说明 当值为0时 使用CREATE TABLE或CREATE DATABASE语句制定的大小写字母在硬盘上保存表名和数据库名。名称比较对大小写敏感。在大小写不敏感的操作系统如windows 或Max OS x上我们不能将参数设为0

大厂高频Mysql面试题

大兔子大兔子 提交于 2020-05-02 08:49:21
前言 前几天有读者找到我,说想要一套全面的Mysql面试题,今天陈某特地为她写了一篇。 文章的目录如下: Mysql面试题 什么是SQL? 结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。 作用:用于存取数据、查询、更新和管理关系数据库系统。 什么是MySQL? MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。 数据库三大范式是什么? 第一范式 :每个列都不可以再拆分。 第二范式 :在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式 :在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。 在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。 mysql有关权限的表都有哪几个? MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql

mysql 5.7 安装配置及无法启动的问题解决

戏子无情 提交于 2020-05-02 07:33:32
(用这篇配置就能正常配置成功) mysql 免安装版配置方法: https://www.jb51.net/article/134452.htm 参考: https://blog.csdn.net/qq_23994787/article/details/80648731 mysql 安装问题一:由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。 参考: https://blog.csdn.net/zhongaiyisheng_/article/details/85924378 这种错误是由于未安装 vcredist 引起的 下载 vcredist 地址: https://www.microsoft.com/zh-CN/download/details.aspx?id=40784 安装刚才下载的那个软件,位置默认即可,安装成功 然后重新进行安装,成功解决这个问题! 这里是上面的原文备份: mysql 5.7.21 winx64免安装版配置方法,供大家参考,具体内容如下 1、下载 点击 下载地址 2、解压到目录 3、配置 新建一个txt文档,另存为my.ini,放在MySQL目录下 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 #