mysql索引

**MySQL锁机制与用法分析**

柔情痞子 提交于 2020-02-08 10:14:21
原文: https://www.jb51.net/article/139113.htm MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是页面锁,但也支持表级锁;InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下采用行级锁。 MySQL这3种锁的特性可大致归纳如下: (1)表级锁 :开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 (2)行级锁 :开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 (3)页面锁 :开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 仅从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理系统。 一、MyISAM表锁 1. 查询表级锁争用情况 show status like 'table%'; 如果table_locks_waited 的值比较高,则说明存在着比较严重的表级锁争用情况。 2. MySQL表级锁的锁模式 MySQL 的表级锁有两种模式:表共享读锁和表独占写锁。 当一个session对某个表加了读锁之后

MySql索引

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-06 22:10:01
MySql索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度 索引也会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件 建立索引会占用磁盘空间的索引文件 所以,索引不是越多也好,我们的目的就是把索引建得恰到好处 Mysql索引相关知识 存储引擎 MySQL数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎 同一个数据库也可以使用多种存储引擎的表 在实际开发中使用最多的两种引擎是MyISAM和InnoDB(几乎都是InnoDB) MyISAM MyISAM高速引擎,拥有较高的插入,查询速度 MyISAM存储不支持事务、行级锁和外键约束的功能 MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点 MyISAM的并发插入特性允许同时选择和插入数据 MyISAM表是独立于操作系统的 每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件:表定义文件(.frm),数据文件(.MYD),索引文件(.MYI) InnoDB InnoDB:5.5版本后MySQL的默认数据库,支持事务和行级锁定,比MyISAM处理速度稍慢 InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引

MySQL优化:explain和show profile

六眼飞鱼酱① 提交于 2020-02-06 18:36:36
前言 要想优化SQL语句,首先得知道SQL语句有什么问题,哪里需要被优化。这样就需要一个SQL语句的监控与量度指标,本文讲述的 explain 和 show profile 就是这样两个量度SQL语句的命令。 本文主要基于 MySQL5.6 讲解其用法,因为之后的MySQL版本会去掉 show profile 功能。 SQL脚本 本篇使用的表结构以及数据如下 /*Table structure for table `dept` */ CREATE TABLE `dept` ( `deptno` int(2) NOT NULL, `dname` varchar(15) DEFAULT NULL, `loc` varchar(15) DEFAULT NULL, PRIMARY KEY (`deptno`) USING BTREE, UNIQUE KEY `index_dept_dname` (`dname`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; /*Data for the table `dept` */ insert into `dept`(`deptno`,`dname`,`loc`) values (10,'ACCOUNTING','NewYork'), (20,'RESEARCH','Dallas')

数据库索引

走远了吗. 提交于 2020-02-06 03:15:30
1.为什么要使用索引 因为索引可以避免全表扫描查找数据,提升检索效率。 2.什么样的信息能成为索引 主键、唯一键等,只要是让数据具备一定区分性的字段都能成为索引 3.索引的数据结构 主流为B±tree 还有Hash结构和 BitMap结构; Mysql数据库不支持BitMap索引,基于InnoDB和Myisam引擎的Mysql不支持显示Hash 来源: CSDN 作者: 梨子果果哟 链接: https://blog.csdn.net/qq_42931883/article/details/104181047

mysql事务隔离界别与锁机制

你说的曾经没有我的故事 提交于 2020-02-05 22:58:43
数据库锁 共享锁(Shared lock) 例1: ---------------------------------------- T1: select * from table (请想象它需要执行1个小时之久,后面的sql语句请都这么想象) T2: update table set column1='hello' 过程:T1运行 (加共享锁) T2运行等待T1运行完之后再运行T2 之所以要等,是因为T2在执行update前,试图对table表加一个排他锁,而数据库规定同一资源上不能同时共存共享锁和排他锁。所以T2必须等T1执行完,释放了共享锁,才能加上排他锁,然后才能开始执行update语句。 例2: ---------------------------------------- T1: select * from table T2: select * from table 这里T2不用等待T1执行完,而是可以马上执行。 分析: T1运行,则table被加锁,比如叫lockA T2运行,再对table加一个共享锁,比如叫lockB。 两个锁是可以同时存在于同一资源上的(比如同一个表上)。这被称为共享锁与共享锁兼容。这意味着共享锁不阻止其它session同时读资源,但阻止其它session update 例3: ---------------------------------

MySQL索引及执行计划

[亡魂溺海] 提交于 2020-02-05 22:54:47
MySQL索引及执行计划 索引 合理的建立索引可以加快数据查询,例如,学校图书管为每一本书编号,根据编号可以快速锁定一本书所在位置。MySQL索引默认B+树索引。索引虽然能够提高检索效率,但同时也会降低更新的速度,因为 insert 、update、delete 也会操作索引文件,会调整因为更新等操作带来的键值变化后的索引信息。 索引类型 主键索引:唯一索引,并且并指定为 primary key ,每个表中只能有一个主键 唯一索引:索引列的所有值都只能出现一次,即值必须唯一,值可以为空 普通索引:基本的索引类型,值可以为空,没有唯一性限制 复合索引:一个索引中包含多个列 何时建立索引 主键自动创建唯一索引 频繁作为查询条件的字段适合创建索引 查询中与其他表关联的字段适合创建索引 频繁更新的字段不适合创建索引,因为在更新记录的同时会更新索引 where条件中使用不到的字段不需要创建索引 在高并发下,在单值索引和复合索引中,复合索引更合适 order by字段添加索引可以提高排序速度 不需要索引 表记录较少 经常增删改的表 数据重复且分布平均的表,如性别 执行计划 可以使用 explain 关键字模拟优化器执行sql查询语句,从而分析查询语句或者表结构的性能瓶颈。 通过查看执行计划,可以了解到表的读取顺序、数据读取操作、哪些索引可以使用、哪些索引被实际使用、表之间的引用

索引

旧街凉风 提交于 2020-02-05 18:54:07
索引的三个特征: 1,索引高度很低 2,索引有序 3,索引存储索引列的值 索引是帮助mysql高效获取数据的排好序的数据结构 索引的数据结构 二叉树 红黑树 Hash表 B-Tree https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 来源: CSDN 作者: Michael_lcf 链接: https://blog.csdn.net/Michael_lcf/article/details/104185009

[mysql]索引和视图

风流意气都作罢 提交于 2020-02-04 19:31:39
索引和视图 索引:可以加快查询速度 视图:是一种虚拟存在的表 导入:从文件中导入数据到表 导出:从表中导出到文件中 备份:mysqldump 备份数据库到文件 恢复:从文件恢复数据库 #索引 alter table tbname add index indexname (colname); create index indexname on tbname (colname); show index from tbname; 在使用SELECT语句查询的时候,语句中WHERE里面的条件,会自动判断有没有可用的索引 #视图 1.数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中; 2.使用视图查询数据时,数据库系统会从原来的表中取出对应的数据; 3.视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变; 在使用视图的时候,可以把它当作一张表。 create view viewname(colname1,colname2...) as select col1, col2...from tbname; #导入操作 LOAD DATA INFILE '文件路径和文件名' INTO TABLE 表名字; #导出操作 SELECT 列1,列2 INTO OUTFILE '文件路径和文件名' FROM 表名字; 备份与导出的区别

mysql语句优化原则

我与影子孤独终老i 提交于 2020-02-04 18:12:59
有时候发现数据量大的时候查询起来效率就比较慢了,学习一下mysql语句优化的原则,自己在正常写sql的时候还没注意到这些,先记录下来,慢慢一点一点的学,加油! 这几篇博客写的都可以: https://blog.csdn.net/s1547823103/article/details/79205670 https://blog.csdn.net/u011277123/article/details/78904569 使用索引的原则: 1.最左前缀匹配原则。 mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。所以要尽量把“=”条件放在前面,把这些条件放在最后。 不会用到b的索引: where a=1 and c>0 and b=2 会用到b的索引: where a=1 and b=2 and c>0 2.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少。 3.当取出的数据超过全表数据的20%时,不会使用索引。 4.使用like时注意: 不使用索引: like ‘%L%’ 使用索引: like ‘L%’ 5.尽量将or 转换为 union all 不使用索引: select * from user where name=’a’ or age=’20

性能优化-索引优化SQL的方法

拥有回忆 提交于 2020-02-04 11:27:33
4、索引优化SQL的方法 1、索引的维护及优化(重复及冗余索引) 增加索引会有利于查询效率,但会降低insert,update,delete的效率,但实际上往往不是这样的,过多的索引会不但会影响使用效率,同时会影响查询效率,这是由于数据库进行查询分析时,首先要选择使用哪一个索引进行查询,如果索引过多,分析过程就会越慢,这样同样的减少查询的效率,因此我们要知道如何增加,有时候要知道维护和删除不需要的索引 2、如何找到重复和冗余的索引 重复索引: 重复索引是指相同的列以相同的顺序建立的同类型的索引,如下表中的 primary key和ID列上的索引就是重复索引 create table test( id int not null primary key, name varchar(10) not null, title varchar(50) not null, unique(id) )engine=innodb; 冗余索引: 冗余索引是指多个索引的前缀列相同,或是在联合索引中包含了主键的索引,下面这个例子中key(name,id)就是一个冗余索引。 create table test( id int not null primary key, name varchar(10) not null, title varchar(50) not null, key(name,id)