Mysql 架构和索引

字段类型选择
慷慨是不明智的
在相关的表中使用相同的数据类型,因为可能进行join
选择标示符:整数通常是最佳选择,尽量避免使用字符串
大致决定数据类型(数字,字符串,时间等)
选择存储更小的类型,选择更简单的类型(如整数优于字符串),选择mysql内建时间类型而不是字符串,选择整数而不是字符串来保存IP
尽量避免使用NULL:任何包含null值的列都将不会被包含在索引中。即使索引有多列这样之情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。
确定特定类型
varchar(字节数) 变长字符串
varchar内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535
5.0之后的mysql对其读写都会保留末尾空格
插入过量会被截断但是不报错
char 定长字符串
对其写,会去掉末尾空格
比较
varchar容易产生碎片,char不会
最大长度远大于平均长度的,适用varchar
固定长度,或者最大长度很短的,适用于char
整数 tinyint (8bit) smallint (16bit) mediumint (24bit) int (32bit) bigint (24bit)
signed 和 unsigned 占用空间一致, 后者把最大值大概扩大了一倍
整数类型定义宽度( 如 int(10) unsigned )对存储没有影响,只是影响某些交互工具展示
实数 TODO
数字
字符串
binary 和 varbinary:保存二进制字符串,他们保存的是字节而不是字符,填充是\0而不是空格
blob 和 text: 不能索引这些类型的完整长度,也不能为排序使用索引
排序时只按照max_sort_length规定的若干字节排序,或者可以自己指定 order by substring(column, length)
enum
建表时指定该类型: create table table_name (column_name enum(‘a‘, ‘b‘, ‘c‘) not null);
该字段将是1到2个字节(所有最多的枚举数是65535),存储的书数字
select 出来的字段值将是字符串
可以将其转为数字: select column_name + 0 ...
内部排序是按照数字(所以定义的时候应该注意顺序),或者显式指定:order by field(column_name, (‘b‘, ‘a‘, ‘c‘))
在建表后需要新增枚举种类只能alter table,所有不适合种类不确定的类型
优势:节约空间 劣势:join字符串时会较慢(存在转换)
日期和时间
year
date
datetime 8字节存储,和时区无关,1001年到9999年,精度为秒
timestamp 4字节,和时区相关,表示从1970年1月1日以来的秒数
通常应该用timestamp,更节约空间
BIT TODO
SET TODO
索引
索引类型:
B-Tree索引:除了Archive引擎外都支持
Hash索引:Memory引擎,
可以在其它B-Tree索引上建立自己的Hash索引:增加一列被索引的列(作为Hash的key),该列允许一定得碰撞,需要一个hash函数(如CRC32),不应该使用强加密函数(如SHA1 MD5等,碰撞低但是费空间,查找速度慢)
R-Tree索引:MyISAM支持 #TODO
FULLTEXT: MyISAM支持 #TODO
高性能索引策略
隔离列:列不是表达式的一部分,也不在函数之中
EXPLAIN
id 表示执行顺序
id从大到小,id相同从上往下
select_type 查询类型
SIMPLE:查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂的子部分,最外层查询则被标记为PRIMARY
SUBQUERY 在SELECT或WHERE列表中包含了子查询,该子查询被标记为SUBQUERY
DEPEDENT SUBQUERY 依赖外部查询的子查询
DERIVD 在FROM列表中包含的子查询被标记为DERIVED(衍生)
UNION RESULT 从UNION表获取结果的SELECT被标记为UNION RESULT
table 记录查询引用的表
TYPE:
访问类型,表示MySQL在表中找到所需行的方式
从最好到最差:
(唯一或非唯一)组合索引的前一部分:select * from t where unique_or_not_unique_combined_index_1 = ‘abc‘
非唯一组合或单列索引的全部:select * from t where not_unique_combined_index_1 = ‘abc‘ and not_unique_combined_index_2 = ‘123‘
唯一索引的前缀匹配:
NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引, 比如id=-1, min(id) max(id)????#TODO
select * from deals where id=-1;
select max(id) from deals;
system: 表只有一行记录(等于系统表)。这是 const表连接类型的一个特例,下例中子查询是const,主查询是system:
select * from ( select * from deals where id=1)t;
const: 表中最多只有一行匹配的记录,它在查询一开始的时候就会被读取出来(腾云科技ty300.com)。由于只有一行记录,在余下的优化程序里该行记录的字段值可以被当作是一个恒定值。const表查询起来非常快,因为只要读取一次!const 用于在和 primary key 或unique 索引中有固定值比较的情形
select * from tbl_name where primary_key=1;
select * from tbl_name where primary_key_part1=1 and primary_key_part2=2;
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。 这是最好的连接类型。它用在索引所有部分都用于做连接并且这个索引是一个primary key 或 unique 类型。eq_ref可以用于在进行"="做比较时检索字段。下列先对user_trades全表扫描(ALL)然后对deals唯一索引扫描eq_ref
select * from deals, user_trades where deals.id=user_trades.deal_id;
select * from ref_table,other_table where ref_table.key_column_part1=other_table.column and ref_table.key_column_part2=1;
ref:非唯一性索引扫描,返回匹配某个单独值的所有行。常见于使用非唯一索引即唯一索引的非唯一前缀进行的查找
ref_or_null: 这种连接类型类似 ref,不同的是mysql会在检索的时候额外的搜索包含null值的记录
select * from ref_table where key_column=expr or key_column is null;
unique_subquery: in中使用主键查询的子查询
value in (select primary_key from single_table where some_expr)
index_subquery: 这种连接类型类似 unique_subquery。不过它用于在子查询中没有唯一索引的情况下:
value in (select key_column from single_table where some_expr)
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between, <, >, in, like 等的查询
index: Full Index Scan,index与ALL区别为index类型只遍历索引树
ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

稿源:勤快学QKXue.NET

更多Mysql 架构和索引介绍

时间: 2024-11-29 03:11:27

Mysql 架构和索引的相关文章

MySQL的架构和索引

  MySQL系统架构图 MySQL架构总共三层,在上图中以虚线作为划分. 第一层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构.比如:连接处理.授权认证.安全等. 第二层:的架构包括大多数的MySQL的核心服务.包括:查询解析.分析.优化.缓存以及所有的内置函数(例如:日期.时间.数学和加密函数).同时,所有的跨存储引擎的功能都在这一层实现:存储过程.触发器.视图等. 第三层:包含了存储引擎.存储引擎负责MySQL中数据的存储和提取.服务器通过API和

MySQL架构优化实战系列1:数据类型与索引调优全解析

一.数据类型优化 数据类型 整数   数字类型:整数和实数 tinyint(8).smallint(16).mediuint(24).int(32).bigint(64) 数字表示对应最大存储位数,如 tinyint (-127 --- 128),tinyint unsigned 表示不允许负数,则范围为 (0 -- 255). 常规数据库中 int(11) 只是表示控制显示字符的个数是11个,int(1) 和 int(20) 存储和计算是一样的,即 int(1) 照样可以存储1111(4位数)

MySQL 架构组成--物理文件组成

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.MySQL Server 简介 什么是MySQL? 答:是目前IT行业最流行的开放源代码的数据库管理系统之一,它同时也是一个支持多线程高并发多用户的关系型数据库管理系统. 特点: 简单:安装简单 高效:读写性能高,仅次于oracle 可靠:运行稳定 MySQL 与其他数据库的简单比较: 1)       功能比较 2)       易

步步深入:MySQL架构总览-&gt;查询执行流程-&gt;SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的‘SQL Layer’,下层是各种各样对上提供接口的存储引擎,被称为‘Storage Engin

MYSQL 架构

1.一般都做主从,主一个从两个. 2.如果服务器出现故障怎么做故障转移? 初级:如果主库出现问题,就看是否是主库硬件问题,导致短期时间内无法恢复.如果短期内无法恢复就切从库.(INNODB 断电数据读不会丢,他会写到磁盘,开机自动恢复) 切从库需要程序去判断,然后修改用户权限,因为一般对从库只有只读权限.复制用同步复制,异步总会有数据丢失. 高级:MMM,MHA 详细介绍复制:(参考高性能MYSQL) 1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡

MySQL架构总览-&gt;查询执行流程-&gt;SQL解析顺序

前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识. 一.MySQL架构总览: 架构最好看图,再配上必要的说明文字. 下图根据参考书籍中一图为原本,再在其上添加上了自己的理解. 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的'SQL Layer',下层是各种各样对上提供接口的存储引擎,被称为'Storage Engin

Mysql5.7—mysql性能优化-索引、语句、配置(运维必备)

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. 数据库的类型 1) 第一代数据库: 基于层次模型与网状模型的数据库 层次型数据库比较经典的是IBM公司的IMS(InformationManagement System)数据库,层次型数据库提供了良好的完整性支持,模型简单,对具有一对多层关系的部们描述非常自然.直观,容易理解,比较适用于那些实体间联系是固定的且预先定义好的环境,其性能优于关

MySQL架构

1.MySQL整体逻辑架构 我们先下图看看MySQL整体逻辑架构(MySQL's Logical Architecture) 图1 第一层,即最上一层,所包含的服务并不是MySQL所独有的技术.它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等. 第二层值得关注.这是MySQL的核心部分.通常叫做 SQL Layer.在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断, sql解析,行计划优化, query cache 的处理以及所有内

数据库学习之--Oracle 架构与MySQL架构对比

数据库学习之--Oracle 架构与MySQL架构对比 一.Oracle .MySQL应用对比 如果要说明三者的区别,首先就要从历史入手. Oracle:中文译作甲骨文,这是一家传奇的公司,有一个传奇的大老板Larry Ellision. Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十几家公司,老婆也离他而去.开始创业时只有1200美元,却使得Oracle公司连续12年销售额每年翻一番. Oracle成立于1977年,早期的理论基础,反而来自于一篇IBM的论文<A