mysql创建索引

『浅入浅出』MySQL 和 InnoDB

﹥>﹥吖頭↗ 提交于 2020-01-09 11:41:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL、PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的、不了解数据库的有所帮助。 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出。 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有两个词非常容易混淆,也就是 数据库 和 实例 : 数据库:物理操作文件系统或其他形式文件类型的集合; 实例:MySQL 数据库由后台线程以及一个共享内存区组成; 对于数据库和实例的定义都来自于 MySQL 技术内幕:InnoDB 存储引擎 一书,想要了解 InnoDB 存储引擎的读者可以阅读这本书籍。 数据库和实例 在 MySQL 中,实例和数据库往往都是一一对应的,而我们也无法直接操作数据库,而是要通过数据库实例来操作数据库文件,可以理解为数据库实例是数据库为上层提供的一个专门用于操作的接口。 在 Unix 上,启动一个

MySQL InnoDB索引介绍及优化ZZ

拈花ヽ惹草 提交于 2020-01-09 11:03:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 正文: 一、先说说什么是索引? 索引(index)翻译为一个目录,用于快速定位我们想要找的数据的位置。例如:我们把一个数据库比作一本书,而索引(index)就是书中的目录,此刻要找到书的某个感兴趣的内容,我们一般是不会整本书翻完再去确认该内容在哪里,而是通过书的目录,定位到该内容章节所在页数,最后直接翻到该页面 我们来看看在数据库中的索引: 全表扫描 VS 索引扫描 以字典为例,全表扫描就是如果我们查找某个字时,那么通读一遍新华字典,然后找到我们想要找到的字 而跟全表扫描相对应的就是索引查找,索引查找就是在表的索引部分找到我们想要找的数据具体位置,然后会到表里面将我们想要找的数据全部查出 实例:在一张学生表找到一个名字叫Dev的学生 左边全表扫描:需要从第一行开始一行行的扫描,直到找到100008行Dev这个学生的信息为止,将这个数据返回回来,但有可能该表中还有同名的学生,因此扫描并没有结束,通常全表扫描要找到一个数据,是需要将整张表的数据遍历一遍,然后才能确定是否将所有数据返回 右边索引扫描:索引查找是根据首字母排序找到D开头的Dev,如果首字母相同,那么再根据第二个字母排序找到,以此类推,我们找到ID为100008,然后回表查出ID为100008的数据 结论:因此索引(对应InnoDB

MySQL必知存储引擎

家住魔仙堡 提交于 2020-01-08 22:21:30
Mysql存储引擎 1.MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务. 2.InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎. 3.BDB源 自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性 4.Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失 5.Merge将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用 6.Archive非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差 7.Federated将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用 8.Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用 9.CSV 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。 10

MySQL Execute Plan--Index Merge特性

对着背影说爱祢 提交于 2020-01-08 18:04:50
Index Merge特性 在MySQL 5.5之前版本中,查询或子查询被限制在一个表只能使用一个索引(回表查询除外)。 假设表TB1001上C1和C2列分别有单列索引,如对下面查询: SELECT * FROM TB1001 WHERE C1='XXX' OR C2='XXX'; 单独使用任一索引都无法获取到所有满足条件的数据,因此查询只能使用全表扫描。 在MySQL 5.5版本中引入Index Merge特性,允许: 查询对一个表上多个索引进行范围扫描并将多个扫描结果进行合并(UNION/INTERSECT)。 Index Merge三种合并算法: 1、Index Merge Intersect:对多个结果集求交集 2、Index Merge Union:对多个结果集求UNION集合(无需对结果集排序) 3、Index Merge Sort-Union:对多个结果集先排序再求UNION集合 Index Merge Intersect算法 当查询过滤条件(WHERE部分)上使用AND关联多个不同KEY的过滤条件时,如: # 表TB1001有主键索引PRIMARY KEY(ID) # 表TB1001有辅助索引IDX_C1(C1) 和辅助索引IDC_C2(C2) SELECT * FROM TB1001 WHERE C1='XXX' AND C2='XXX'; 不使用Index

19条MySQL优化准则

懵懂的女人 提交于 2020-01-08 04:36:33
1、EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。 下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据: type列 , 连接类型。一个好的SQL语句至少要达到range级别。杜绝出现all级别。 key列, 使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。 key_len列, 索引长度。 rows列, 扫描行数。该值是个预估值。 extra列, 详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。 2、SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了;再或者使用连接来替换。 3、SELECT语句务必指明字段名称 SELECT*增加很多不必要的消耗(CPU、IO、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。 4、当只需要一条数据的时候,使用limit 1 这是为了使EXPLAIN中type列达到const类型 5

联合索引最左匹配原则

时光毁灭记忆、已成空白 提交于 2020-01-07 22:57:27
什么时候创建组合索引? 当我们的where查询存在多个条件查询的时候,我们需要对查询的列创建组合索引 为什么不对每一列创建索引 减少开销 覆盖索引 效率高 减少开销:假如对col1、col2、col3创建组合索引,相当于创建了(col1)、(col1,col2)、(col1,col2,col3)3个索引 覆盖索引:假如查询SELECT col1, col2, col3 FROM 表名,由于查询的字段存在索引页中,那么可以从索引中直接获取,而不需要回表查询 效率高:对col1、col2、col3三列分别创建索引,MySQL只会选择辨识度高的一列作为索引。假设有100w的数据,一个索引筛选出10%的数据,那么可以筛选出10w的数据;对于组合索引而言,可以筛选出100w 10% 10%*10%=1000条数据 最左匹配原则 只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合,所以在建立联合索引的时候查询最频繁的条件要放在左边 假设我们创建(col1,col2,col3)这样的一个组合索引,那么相当于对col1列进行排序,也就是我们创建组合索引,以最左边的为准,只要查询条件中带有最左边的列,那么查询就会使用到索引 创建测试表 CREATE TABLE `student` ( `id` int(11) NOT NULL, `name` varchar

mysql的查询优化

落爺英雄遲暮 提交于 2020-01-07 21:54:44
参考网站: http://www.liyblog.top/p/6 这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’

mysql的查询优化

半腔热情 提交于 2020-01-07 21:53:12
参考网站: http://www.liyblog.top/p/6 这里总结了52条对sql的查询优化,下面详细来看看,希望能帮助到你 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’

MongoDB开发规范

南楼画角 提交于 2020-01-07 20:53:24
一.命名规则 1.mongodb版本选择: 默认新装数据库使用MongoDB 3.X 社区版。建议3.2.10+ 2.数据库设计规范 数据库名可以是满足以下条件的任意UTF-8字符串: (1)不能出现除“_”字符以外的特殊字符; (2)不能含有”(空格)、.、$、/、、和(空字符); (3)应全部小写; (4)最多30字符。 (5)禁止使用数字打头的库名 3.集合命名规则 必须满足下列条件的任意UTF-8字符串 (1)集合名不能是空字符串“”; 不能出现除“_”字符以外的特殊字符,禁止使用数字开头的名称; (2)集合名不能以“system.”开头,这是为系统集合保留的前缀。例如system.users这个集合保存着数据库的用户信息,system.namespaces集合保存着所有数据库集合的信息; (3)用户创建的集合名字不能含有保留字符$。除非你要访问系统创建的集合,否则不可在名字里出现$; (4)集合名应简洁明了,尽量都使用小写; 4.字段命名规范 (1)字段不能含有(空字符)。 (2)禁止使用数字开头的字段名; (3)不可以“ ”开头命名字段名称,不能出现除“ ”字符以外的特殊字符; (4)字段引用必须采用集合名+被引用字段名称。例如集合user的键id在集合user_info中被引用,用user_id作为键名; (5)只有在遇到引用情况下,字段中包含的集合名首字母需要大写

干货!SQL性能优化,书写高质量SQL语句

回眸只為那壹抹淺笑 提交于 2020-01-07 20:40:48
写SQL语句的时候我们往往关注的是SQL的执行结果,但是是否真的关注了SQL的执行效率,是否注意了SQL的写法规范? 以下的干货分享是在实际开发过程中总结的,希望对大家有所帮助! 1. limit分页优化 当偏移量特别大时,limit效率会非常低。 SELECT id FROM A LIMIT 1000,10 很快 SELECT id FROM A LIMIT 90000,10 很慢 方案一: select id from A order by id limit 90000,10; 复制代码 如果我们结合order by使用。很快,0.04秒就OK。 因为使用了id主键做索引! 当然,是否能够使用索引还需要根据业务逻辑来定,这里只是为了提醒大家,在分页的时候还需谨慎使用! 方案二 select id from A order by id between 90000 and 90010; 复制代码 2.利用limit 1 、top 1 取得一行 有些业务逻辑进行查询操作时(特别是在根据某一字段DESC,取最大一笔).可以使用limit 1 或者 top 1 来终止[数据库索引]继续扫描整个表或索引。 反例 SELECT id FROM A LIKE 'abc%' 复制代码 正例 SELECT id FROM A LIKE 'abc%' limit 1 复制代码 3. 任何情况都不要用