关于mysql:mysql

7次阅读

共计 1483 个字符,预计需要花费 4 分钟才能阅读完成。

Mysql 索引

索引是什么

索引是帮忙 mysql高效获取数据的数据结构 ,数据库索引好比一本书前的目录, 能放慢数据库的查问速度
索引往往是存储在磁盘上的文件中
劣势:能够进步数据检索的效率
劣势:索引会占据磁盘空间,会升高更新表的效率

索引类型

主键索引 :索引列中的值必须是惟一的,不容许有空值
一般索引 :mysql 中一般索引类型,没有什么限度,容许在定义索引的列中插入反复值和空值
惟一索引 :索引列中的值必须是惟一的,然而容许为空值
全文索引 :在进行 like 含糊查问时效率比拟低,这时能够创立全文索引
空间索引 :mysql 在空间索引这方面遵循 OpenGIS 几何数据模型规定
前缀索引:能够指定索引列的长度,然而数值类型不能指定

索引的数据结构

Hash 表
二叉树
B+ 树

mysql 的索引实现

两种存储引擎的索引实现:MyISAM 索引 InnoDb 索引

  • 创立单个字段索引的语法:CREATE INDEX 索引名 on 表名(字段名)
  • 创立联结索引的语法:CREATE INDEX 索引名 on 表名(字段名 1,字段名 2)
  • 索引命名格局个别能够这样:idx_表名_字段名。留神有长度限度
  • 删除索引:DROP INDEX 索引名 ON 表名

  • 中到大数据量表适宜应用索引
  • 小数据量表,大部分状况全表扫描效率更高
  • 特大数据量表,建设和应用索引的代价会随之增大,适宜应用分区或分库

索引:排好序的疾速查找数据结构
单值索引: 即一个索引只蕴含单个列,一个表能够有多个单例索引
惟一索引: 索引列的值必须惟一,但容许有空值
复合索引: 即一个索引蕴含多个列

根本语法:
创立:

  • create [unique] index indexName ON mytable(columnname(length));
  • alter mytable add[unique] index[indexName] ON(columnname(length));

删除:DROP INDEX[indexName] ON mytable;

查看:SHOW INDEX FROM table_name\G

mysql 索引构造:BTree 索引、Hash 索引


频繁作为查问条件的字段应该创立索引
频繁更新的字段不适宜创立索引
where 条件里用不到的字段不创立索引


不适宜建设索引
表记录太小
常常增删改的表
数据反复且散布均匀的表的字段


MyISAM 和 InnoDB
MyISAM:只有表级锁
InnoDB:反对行级锁、和表级锁。默认为行级锁


表级锁
MySQL 中锁定粒度最大的一种锁,对以后操作的整张表加锁,实现简略,资源耗费也比拟少,加锁快,不会呈现死锁,触发锁抵触的概率最高,并发度最低,MyISAM 和 InnoDB 都反对表级锁

行级锁
MySQL 中锁定粒度最小的一种锁,只针对以后操作的行进行加锁,行级锁能大大减少数据库操作抵触,其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会呈现死锁

MyISAM 只有表级锁,InnoDB 行级锁和表级锁(默认行级锁)

垂直分区与程度分区

依据数据库外面数据表的相关性进行拆分。
垂直拆分是指数据表列的拆分,把一张列比拟多的表拆分为多张表。

垂直拆分的长处: 能够使得列数据变小,在查问时缩小读取的 Block 数,缩小 I / O 次数。垂直分区能够简化表的构造,易于保护
垂直拆分的毛病: 主键会呈现冗余,须要治理冗余列,并会引起 join 操作,能够通过在应用层进行 join 来解决。垂直分区会让事务变得更加简单。

程度分区: 放弃数据表构造不变,通过某种策略存储数据分片。这样每一片数据扩散到不同的表或者库中,达到了分布式的目标。程度拆分能够撑持十分大的数据量

SQL 语句的执行流程

权限校验 -> 查问缓存 -> 分析器 -> 优化器 -> 权限校验 -> 执行器 -> 引擎

正文完
 0