MyISAM

[MySQL] 5.索引(三)——聚簇索引

天涯浪子 提交于 2019-11-30 21:41:30
聚簇索引 聚簇索引是一种数据存储方式,InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中(叶子页包含了行的全部数据,节点页只包含了索引列)。“聚簇”表示数据行和相邻的键值紧凑的存储在一起。一个表只能有一个聚簇索引。 InnoDB会选择主键列进行聚簇索引,如果没有定义主键,InnoDB会选择唯一的非空索引代替。如果还是没有,InnoDB会隐式定义一个主键来作为聚簇索引。InnoDB只聚集在同一个页面中的记录。 InnoDb的普通索引(二级索引)的叶子结点中存放的是主键的值,所以需要先查询普通索引(二级索引)的叶子节点找到对应的主键值,然后再根据主键值去聚集索引中查询到对应的数据。 非聚集索引的索引与数据是存在不同文件的。 聚簇索引优点: 可以把相关的数据保存在一起,例如实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少数数据页就能获取某个用户的全部邮件,减少磁盘I/O次数。 数据访问更快:聚簇索引同时将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据要比非聚簇索引更快。 使用覆盖索引扫描的查询可以直接使用节点中的主键值。 聚簇索引缺点: 聚簇索引最大限度地提高了I/O密集型应用的性能。如果数据全放放在内存中,那么聚簇索引就没了优势。 插入速度严重依赖于插入顺序

单表数据量超过千万的优化方案

有些话、适合烂在心里 提交于 2019-11-30 13:58:14
1. 数据库设计和表创建时就要考虑性能 2.sql 的编写需要注意优化 4. 分区 4. 分表 5. 分库 数据库设计和表创建时就要考虑性能 设计表时要注意: 表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。 尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。 使用枚举或整数代替字符串类型 尽量使用TIMESTAMP而非DATETIME 单表不要有太多字段,建议在20以内 用整型来存IP 索引 索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描 应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段 字符字段只建前缀索引 字符字段最好不要做主键 不用外键,由程序保证约束 尽量不用UNIQUE,由程序保证约束 使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引 简言之就是使用合适的数据类型,选择合适的索引 # 选择合适的数据类型 ( 1 )使用可存下数据的最小的数据类型,整型 < date,time <

MySQL面试专题(一)

此生再无相见时 提交于 2019-11-30 13:02:09
MySQL 基础模块的面试题总结 说一下 MySQL 执行一条查询语句的内部执行过程? 客户端先通过连接器连接到 MySQL 服务器。 连接器权限验证通过之后,先查询是否有查询缓存,如果有缓存(之前执行过此语句)则直接返回缓存数据,如果没有缓存则进入分析器。 分析器会对查询语句进行语法分析和词法分析,判断 SQL 语法是否正确,如果查询语法错误会直接返回给客户端错误信息,如果语法正确则进入优化器。 优化器是对查询语句进行优化处理,例如一个表里面有多个索引,优化器会判别哪个索引性能更好。 优化器执行完就进入执行器,执行器就开始执行语句进行查询比对了,直到查询到满足条件的所有数据,然后进行返回。 MySQL 提示“不存在此列”是执行到哪个节点报出的? 此错误是执行到分析器阶段报出的,因为 MySQL 会在分析器阶段检查 SQL 语句的正确性。 MySQL 查询缓存的功能有何优缺点? MySQL 查询缓存功能是在连接器之后发生的,它的优点是效率高,如果已经有缓存则会直接返回结果。 查询缓存的缺点是失效太频繁导致缓存命中率比较低,任何更新表操作都会清空查询缓存,因此导致查询缓存非常容易失效。 如何关闭 MySQL 的查询缓存功能? MySQL 查询缓存默认是开启的,配置 query cache type 参数为 DEMAND(按需使用)关闭查询缓存,MySQL 8.0

MyISAM与InnoDB的索引差异

耗尽温柔 提交于 2019-11-30 11:59:39
一文快速读懂Mysql引擎MyISAM与InnoDB的索引设计上的差异 MyISAM的索引 InnoDB的索引 对于InnoDB表,这里的启示是: 总结 本文是根据微信知识星球沈剑老师的文章总结感悟所写(原文地址:https://mp.weixin.qq.com/s/FUXPXKfKyjxAvMUFHZm9UQ) 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index)。InnoDB和MyISAM都是利用B+树来实现这两类索引,下面比较下两者的差异 MyISAM的索引 MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)。 MyISAM中主键索引与普通索引没有本质差异: • 有连续聚集的区域单独存储行记录 • 主键索引的叶子节点存储主键与对应行记录的指针 • 普通索引的叶子结点存储索引字段与对应行记录的指针 MyISAM的表可以没有主键。 主键索引与普通索引是两棵独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。 举个例子,MyISAM: t(id PK, name KEY, sex, flag); 表中有四条记录: 1, shenjian, m, A 3, zhangsan, m, A 5, lisi, m, A 9, wangwu, f, B 其B

记一个 MySQL Streaming result set 时的小错误

大兔子大兔子 提交于 2019-11-30 11:58:35
同事使用kettle迁移MySQL数据时出现了 SQLException,详细报错信息如下: Error reading from database: java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@xxxxxxx is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries. 经查询 MySQL官方文档 (MySQL版本 5.1-8.0 一样),发现报错原因是JDBC没有处理完resultSet结果集时又使用同一个connection提交了新的query。下面是官方文档对ResultSet的JDBC实现说明: 默认情况下,ResultSet会一次性返回结果集并保存在内存中。这也是最有效率且最容易实现的一种方式。但是当ResultSet含有大量数据(很多行、或者包含大对象的情况下)时

Why to use foreign keys with no action on delete or update

风格不统一 提交于 2019-11-30 11:01:20
I have a question of interest: I have 2 tables in mysql with InnoDb . table tbl_a has a primary key, named a_id ; table tbl_b has a primary b_id and a foreign key on tbl_a.a_id with " ON DELETE NO ACTION ". +-------------+---------------+---------------+ | Table Name | Primary Key | Foreign Key | +-------------+---------------+---------------+ | tbl_a | a_id | | | tbl_b | b_id | a_id | +-------------+---------------+---------------+ why should I still use InnoDb and foreign keys, if i don't really use the magic of foreign keys in the end in anyway? Is there still a point of using innodb and

MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;

孤街浪徒 提交于 2019-11-30 09:40:30
一、 MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的。 2 MySQL 整个查询执行过程 • 客户端向 MySQL 服务器发送一条查询请求 • 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段 • 服务器进行 SQL 解析、预处理、再由优化器生成对应的执行计划 • MySQL 根据执行计划,调用存储引擎的 API 来执行查询 • 将结果返回给客户端,同时缓存查询结果 3 启动执行计划 EXPLAIN SELECT 投影列 FROM 表名 WHERE 条件 4 EXPLAIN 列的解释 4.1ID 查询执行顺序: id 值相同时表示从上向下执行 id 值相同被视为一组 如果是子查询,id 值会递增,id 值越高,优先级越高 4.2select_type simple: 表示查询中不包含子查询或者 union primary: 当查询中包含任何复杂的子部分,最外层的查询被标记成 primary derived: 在 from 的列表中包含的子查询被标记成 derived subquery: 在 select 或 where 列表中包含了子查询,则子查询被标记成 subquery union: 两个 select

Is InnoDB sorting really THAT slow?

守給你的承諾、 提交于 2019-11-30 07:39:54
I had all my tables in myISAM but the table level locking was starting to kill me when I had long running update jobs. I converted my primary tables over to InnoDB and now many of my queries are taking over 1 minute to complete where they were nearly instantaneous on myISAM. They are usually stuck in the Sorting result step. Did I do something wrong? For example : SELECT * FROM `metaward_achiever` INNER JOIN `metaward_alias` ON (`metaward_achiever`.`alias_id` = `metaward_alias`.`id`) WHERE `metaward_achiever`.`award_id` = 1507 ORDER BY `metaward_achiever`.`modified` DESC LIMIT 100 Takes about

Understanding MyISAM record structure

十年热恋 提交于 2019-11-30 07:33:49
I am trying to understand how MyISAM physically store its records and how it maintains its structure after record insertion and record deletion. I have read the following link: MyISAM Dynamic Data File Layout MyISAM Record Structure I want to make sure if I understand it correctly, please correct me if it is not right. Fixed-sized record Delete marker determines whether record is deleted or not deleted. Record header holds which column of a row contains NULL value The length of data is fixed. Variable-sized record Delete marker is replaced with BLOCK_DELETED block type Record header holds

史上最全大厂Mysql面试题总结

心不动则不痛 提交于 2019-11-30 07:01:11
今天跟大家分享下大厂Mysql面试题的知识。 1 MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 从:sql执行线程——执行relay log中的语句; 2 MySQL中myisam与innodb的区别,至少5点 (1)、问5点不同; 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>.InnoDB支持MVCC, 而MyISAM不支持 4>.InnoDB支持外键,而MyISAM不支持 5>.InnoDB不支持全文索引,而MyISAM支持。 (2)、innodb引擎的4大特性 插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead) (3)、2者selectcount(*)哪个更快,为什么 myisam更快,因为myisam内部维护了一个计数器,可以直接调取。 3 MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1)、varchar与char的区别