MyISAM

MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序

时光总嘲笑我的痴心妄想 提交于 2020-10-23 08:35:24
MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构。 索引可以让我们避免一行一行进行全表扫描。它的价值就是可以帮助你对数据进行快速定位。 索引分类 按照 功能逻辑 来分 普通索引 INDEX(col_name) 或者 key index_name(col_name) 没有任何约束,一张表可以有多个普通索引 唯一索引 UNIQUE INDEX index_name(col_name) 在不同索引上增加了唯一约束,允许多个ull值 主键索引 PRIMARY KEY (col_name) 主键约束=UNIQUE+NOT NULL,一张表只能有一个主键索引---该性质由主键索引的物理实现方式决定---数据在文件中只能按照一种顺序进行存储 外键索引 CONSTRAINT foreign_key_name FOREIGN KEY(col_name) REFREENCES table_name(col2_name) 全文索引 FULLTEXT INDEX index_name(col_name)...)ENGINE=MyISAM; MySQL自带的全文索引仅支持英文,一般我们使用专门的全文搜索引擎Elasticsearch或者solr。 按照 物理实现 方式来分(也是按照叶子结点的内容来分)

MySQL性能调优【一】

帅比萌擦擦* 提交于 2020-10-22 10:35:59
目录 前言 使用explain 分析你SQL的计划 关键字的慎用 避免判断 null 值 避免使用 or 逻辑 慎用 in 和 not in 逻辑 Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小 exists的合理使用 慎用distinct关键字 尽量用 union all 替换 union 查询优化 GROUP BY关键字优化 查询SQL尽量不要使用select *,而是select具体字段 优化limit分页 知道查询结果为一条记录,建议使用limit 1 注意模糊查询 避免查询条件中字段计算 避免查询条件中对字段进行函数操作 避免不等值判断 对查询进行优化,应考虑在 where 及 order by 涉及的列上建立索引,尽量避免全表扫描。 where子句中考虑使用默认值代替null。 where子句 “= ” 左边注意点 不要定义无意义的查询 索引优化 在适当的时候,使用覆盖索引。 索引无关优化 索引也可能失效 组合索引使用 索引优化总结 其它注意事项 表格字段类型选择 如果插入数据过多,考虑批量插入 count(*) 和 count(1)和count(列名)区别 前言 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况。 网速不给力,不稳定。 服务器内存不够

面试命中率90%的点——MySQL锁

柔情痞子 提交于 2020-10-21 18:04:52
一、对MySQL的锁的了解 当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。 就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。 二、隔离级别与锁的关系 在Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突 在Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁。 在Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。 SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。 三、按照锁的粒度分数据库锁有哪些? 锁机制与InnoDB锁算法 在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。 MyISAM和InnoDB存储引擎使用的锁: MyISAM采用表级锁(table-level locking)。 InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁。 行级锁,表级锁和页级锁对比

面试阿里P6,竟被MySQL难倒,再次二面,进入天猫团队(Java岗)

馋奶兔 提交于 2020-10-21 04:50:44
爱因斯坦说过“耐心和恒心总会得到报酬的”,我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在我身上实现了。 每一个程序员都拥有一座大厂梦,我也不例外,去年面试阿里P6,竟然被MySQL问倒了,很多相关性的问题都没有答上来,才2面就凉凉了。回去之后也潜心复习了,准备了二战,如今终于进入了阿里,被天猫团队录用。 01 阿里面试题之MySQL 请解释关系型数据库概念及主要特点? 请说出关系型数据库的典型产品、特点及应用场景? 请详细描述 SQL 语句分类及对应代表性关键字。 什么是 MySQL 多实例,如何配置 MySQL 多实例? 如何加强 MySQL 安全,请给出可行的具体措施? 误操作执行了一个 drop 库 SQL 语句,如何完整恢复? 详述 MySQL 主从复制原理及配置主从的完整步骤。 MySQL 如何实现双向互为主从复制,并说明应用场景? MySQL 如何实现级联同步,并说明应用场景? MySQL 主从复制故障如何解决? 02 二战阿里,天猫团队面试题(3轮技术面+HR面) 阿里面试技术题: 自我介绍呗 项目介绍呗(先自己介绍项目,然后再聊天) junit用法,before,beforeClass,after,afterClass的执行顺序 分布式锁 nginx的请求转发算法,如何配置根据权重转发 用hashmap实现redis有什么问题(死锁,死循环

带你了解MySQL数据库小技巧

时间秒杀一切 提交于 2020-10-16 08:44:43
1、如何快速掌握MySQL? 培养兴趣 兴趣是最好的老师,不论学习什么知识,兴趣都可以极大地提高学习效率。当然学习MySQL 5.6也不例外。 夯实基础 计算机领域的技术非常强调基础,刚开始学习可能还认识不到这一点,随着技术应用的深入,只有有着扎实的基础功底,才能在技术的道路上走得更快、更远。对于MySQL的学习来说,SQL语句是其中最为基础的部分,很多操作都是通过SQL语句来实现的。所以在学习的过程中,读者要多编写SQL语句,对于同一个功能,使用不同的实现语句来完成,从而深刻理解其不同之处。 及时学习新知识 正确、有效地利用搜索引擎,可以搜索到很多关于MySQL 5.6的相关知识。同时,参考别 人解决问题的思路,也可以吸取别人的经验,及时获取最新的技术资料。 多实践操作 数据库系统具有极强的操作性,需要多动手上机操作。在实际操作的过程中才能发现问题, 并思考解决问题的方法和思路,只有这样才能提高实战的操作能力。 2、如何选择服务器的类型? MySQL服务器配置窗口中各个参数的含义如下。 【Server Configuration Type】该选项用于设置服务器的类型。单击该选项右侧的向下按钮, 即可看到包括3个选项。 3个选项的具体含义如下: Development Machine(开发机器):该选项代表典型个人用桌面工作站。假定机器上运行 着多个桌面应用程序

mysql大表优化方案

允我心安 提交于 2020-10-15 06:03:22
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在 千万级 以下,字符串为主的表在 五百万 以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用 TINYINT 、 SMALLINT 、 MEDIUM_INT 作为整数类型而非 INT ,如果非负则加上 UNSIGNED VARCHAR 的长度只分配真正需要的空间 使用枚举或整数代替字符串类型 尽量使用 TIMESTAMP 而非 DATETIME , 单表不要有太多字段,建议在20以内 避免使用NULL字段,很难查询优化且占用额外索引空间 用整型来存IP 索引 索引并不是越多越好,要根据查询有针对性的创建,考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根据 EXPLAIN 来查看是否用了索引还是全表扫描 应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段 字符字段只建前缀索引 字符字段最好不要做主键 不用外键,由程序保证约束 尽量不用 UNIQUE

MyISAM 和 InnoDB 索引结构及其实现原理

て烟熏妆下的殇ゞ 提交于 2020-10-14 05:57:23
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。 索引的实现通常使用B_TREE。 B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据; 相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。 MyISAM引擎 使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址. 即:MyISAM索引文件和数据文件是分离的,MyISAM的索引文件仅仅保存数据记录的地址。 MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引, 如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引方式也叫做“非聚集”的。 物理文件结构为: .frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。 .myd(mysql data)文件:myisam存储引擎专用,用于存储myisam表的数据 .myi(mysql index)文件:myisam存储引擎专用,用于存储myisam表的索引相关信息 InnoDB引擎 也使用B+Tree作为索引结构,但是InnoDB的数据文件本身就是索引文件,叶节点data域保存了完整的数据记录。 这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这种索引叫做

学习笔记

十年热恋 提交于 2020-10-13 06:18:13
1、有朋友给我留言 为什么他的库表里面,有些是连续的,有些不是连续的,而且他的表都是自增(`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id'),他的潜意识里这个id应该是连续的才对。因此准备梳理梳理mysql自增主键的值的变化情况,让朋友有个比较全面的了解。 2、自增值存储说明 2.1 MyISAM 引擎的自增值保存在数据文件中。 2.2 InnoDB 引擎的自增值,其实是保存在了内存里,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为 MySQL 重启前的值”,具体情况是: a)在 MySQL 5.7 及之前的版本,自增值保存在内存里。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id) + 1 作为这个表当前的自增值。 b)在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。 3、自增值修改机制 在 MySQL 里面,如果字段 id 被定义为 AUTO_INCREMENT,在插入一行数据的时候,自增值的行为如下: 如果插入数据时 id 字段指定为 0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT

2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)

北城以北 提交于 2020-10-12 03:44:22
线程池的参数 创建线程的方式 如何暂停线程,有几种方式 线程之间的通讯 线程中什么是原子性、什么是可见性、什么是有序性? Volatile是如何实现可见性的? AQS中共享锁有哪些?独占锁有哪些 synchronized 关键字有几种用法? synchronized 的缺点有哪些? 静态方法和非静态方法锁的对象分别是什么? 对象锁和类锁有什么区别? 什么是哨兵机制? jvm中堆是否存储了所有对象 哪些没有存入里面 堆中的有哪些区域,1.8和之前有什么区别 元空间和永久代有什么区别 创建一个对象一定会存入新生区吗? 哪些情况不会存入新生代, jvm的工作流程 luinx中文件的权限管理 ArrayList和链表的区别 hashmap和hashtable有什么区别 java中异常分为哪几种类? Error 、Runtime Exception 、Exception 分别是什么?他们之间的关系是什么? 你遇到过哪些异常? tcp的三次握手,为什么要三次,俩次不行吗? tcp三次握手中传递的参数有哪些? tcp和udp的区别? 数据库索引为什么查询快? 数据库索引有哪些数据结构? 主键索引和二级索引的区别? 回表是什么? 使用非主键索引查询会不会出现回表? MySQL中你知道有哪些存储引擎? InnoDB跟Myisam的区别? 什么是事务? 事务的四大特性? 哪些存储引擎支持事务?

Mysql 8.0版本开始,不允许创建 MyISAM 分区表

一个人想着一个人 提交于 2020-10-09 00:49:02
从MySQL 8.0版本开始,就不允许创建 MyISAM 分区表了,只允许创建已经实现了本地分区策略的引擎。 到目前为止,只有InnoDB和NDB这两个引擎支持本地分区策略。 【1】实际测试 (1)数据库版本号 # 获取版本号 SELECT VERSION(); # 8.0.12 (2)建表(InnoDB引擎) CREATE TABLE `t_innodb` ( `ftime` DATETIME NOT NULL, `c` INT(11) DEFAULT NULL, KEY (`ftime`) ) ENGINE=INNODB DEFAULT CHARSET=latin1 PARTITION BY RANGE (YEAR(ftime)) (PARTITION p_2017 VALUES LESS THAN (2017) ENGINE = INNODB, PARTITION p_2018 VALUES LESS THAN (2018) ENGINE = INNODB, PARTITION p_2019 VALUES LESS THAN (2019) ENGINE = INNODB, PARTITION p_others VALUES LESS THAN MAXVALUE ENGINE = INNODB); 创建成功。 (3)建表(MyiSAM引擎) CREATE TABLE `t