mysql创建索引

MySQL实战45讲学习笔记:“order by”是怎么工作的?(第16讲)

主宰稳场 提交于 2019-11-30 18:47:00
一、今日内容概要 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按 照姓名排序返回前 1000 个人的姓名、年龄。 假设这个表的部分定义是这样的: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`) ) ENGINE=InnoDB; 这时,你的 SQL 语句可以这么写: select city,name,age from t where city='杭州' order by name limit 1000 ; 这个语句看上去逻辑很清晰,但是你了解它的执行流程吗?今天,我就和你聊聊这个语句是怎么执行的,以及有什么参数会影响执行的行为 二、全字段排序 前面我们介绍过索引,所以你现在就很清楚了,为避免全表扫描,我们需要在 city 字段加上索引。 在 city 字段上创建索引之后,我们用 explain 命令来看看这个语句的执行情况。 图 1

SQL相关优化

拟墨画扇 提交于 2019-11-30 18:43:52
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/samjustin1/article/details/52314813 第一方面:30种mysql优化sql语句查询的方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。   2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。   3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:   select id from t where num is null   可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:   select id from t where num=0   4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:   select id from t where num=10 or num=20   可以这样查询:   select id from t where num=10   union all   select id from t where num=20  

mysql数据库索引

被刻印的时光 ゝ 提交于 2019-11-30 18:05:38
什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构。一个非常恰当的比喻就是书的目录页与书的正文内容之间的关系,为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。 主键索引: 数据列不允许重复,不允许为NULL.一个表只能有一个主键。 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。 可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引 可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。 可以通过 ALTER TABLE table_name ADD INDEX index_name (column); 创建普通索引 可以通过 ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3); 创建组合索引 全文索引: 是目前搜索引擎使用的一种关键技术。 可以通过 ALTER TABLE table_name ADD FULLTEXT (column);

为应用选择和创建最佳索引,加速数据读取

戏子无情 提交于 2019-11-30 17:13:55
在工作之中,由于SQL问题导致的数据库故障层出不穷,索引问题是SQL问题中出现频率最高的,常见的索引问题包括:无索引,隐式转换,索引创建不合理。 当数据库中出现访问表的SQL没创建索引导致全表扫描,如果表的数据量很大扫描大量的数据,执行效率过慢,占用数据库连接,连接数堆积很快达到数据库的最大连接数设置,新的应用请求将会被拒绝导致故障发生。 隐式转换是指SQL查询条件中的传入值与对应字段的数据定义不一致导致索引无法使用。常见隐式转换如字段的表结构定义为字符类型,但SQL传入值为数字;或者是字段定义collation为区分大小写,在多表关联的场景下,其表的关联字段大小写敏感定义各不相同。隐式转换会导致索引无法使用,进而出现上述慢SQL堆积数据库连接数跑满的情况。 索引使用策略及优化 创建索引 在经常查询而不经常增删改操作的字段加索引。 order by与group by后应直接使用字段,而且字段应该是索引字段。 一个表上的索引不应该超过6个。 索引字段的长度固定,且长度较短。 索引字段重复不能过多。 在过滤性高的字段上加索引。 使用索引注意事项 使用like关键字时,前置%会导致索引失效。 使用null值会被自动从索引中排除,索引一般不会建立在有空值的列上。 使用or关键字时,or左右字段如果存在一个没有索引,有索引字段也会失效。 使用!=操作符时,将放弃使用索引。因为范围不确定

MySQL高级部分笔记

谁说我不能喝 提交于 2019-11-30 16:29:19
有关于MySQL的高级部分笔记 这是一篇关于 MySQL 高级部分的笔记主要是,sql优化以及mysql锁的相关内容,以及主从配置等内容等比较基础的优化 一、逻辑架构部分 逻辑架构 逻辑架构介绍图如下        连接层:最上层是一些客户端和连接服务,包含本地的sock通讯大多时基于客户端/服务端工具实现的类似于tcp/ip的通讯 服务层:完成大多数的核心服务的功能,如,SQL接口,并完成缓存的查询SQL的分析和优化以及部分内置函数的执行,所有款存储引擎的功能 引擎层:存储引擎真正的负责了MySQL中的数据的存储和提取,服务器通过api与存储引擎进行通讯,常用的有MyISAM和InnoDB 存储层:数据存储在裸设备上,并完成与存储引擎的交互 优化主要是只使SQL的解析格式符合优化器的优化格式 存储引擎 查看mysql的存储引擎命令 # 看你的mysql提供了生么存储引擎show engines;# 看当前默认的存储引擎show variables like '%storage_engine%'; MyISAM与InnoDB的对比如下表 对比项 MyISAM InnoDB 主外键 不支持 支持 事务 不支持 支持 行表锁 表锁,即使操作一条记录也会锁住整个表, 不适合高并发的操作 行锁,操作时只锁某一行,不对其他的行有影响, 适合高并发的操作 缓存 只缓存索引不缓存真实数据

【11】MySQL:优化

落爺英雄遲暮 提交于 2019-11-30 16:06:53
写在前面的话 不管是作为运维还是作为 DBA,我们的工作都不是写 SQL,搞业务。更多的还是如何实现又好又快的给开发提供一个数据库环境和保障数据的安全性。前面的文章中读写分离,高可用,建立索引,分库分表等都是类似改变业务的架构来提升数据库的性能和稳定性。本章节介绍如何通过修改 my.cnf 配置文件直接以最低的成本提升服务器的性能。 关于 MySQL 优化 优化的标准: 1. 优化有风险,配置需谨慎。 2. 优化永远不是一个人的问题,需要开发,运维,DBA 共同介入。 3. 稳定比性能重要,没有明显提升的优化是失败的。 4. 一个问题的解决往往伴随着另外一个问题的产生,优化不一定都是好的。 优化的方向:安全和性能 优化的范围: 1. 硬件和系统:例如机器配置,网络,系统优化等。 2. 业务程序优化:例如索引,锁,SQL 性能等。 3. 数据库优化:例如数据库架构,数据库配置参数等。 操作系统级别的优化 1. CPU 使用情况:top 命令 --> 按 1 我这里选的 4 核,所以可以看到 4 个 CPU。 主要指标: us :use,用户程序运行中 CPU 占比,理想中是能达到 70% 最好,这样才能说明设备性能充分利用。 sy :sys,系统资源,一般内核调用,这个偏高可能是 BUG,中毒或者数据库锁住了。 id :idle,空闲时间占比。 wa :wait,等待时间

MySQL优化:如何避免回表查询

Deadly 提交于 2019-11-30 14:50:03
参考: https://www.cnblogs.com/myseries/p/11265849.html InnoDB有两大类索引:聚集索引(clustered index)和普通索引(secondary index) nnoDB 聚集索引 的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引: (1)如果表定义了PK,则PK就是聚集索引; (2)如果表没有定义PK,则第一个not NULL unique列是聚集索引; (3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引; InnoDB 普通索引 的叶子节点存储主键值。 两个B+树索引分别如上图:   (1)id为PK,聚集索引,叶子节点存储行记录;   (2)name为KEY,普通索引,叶子节点存储PK值,即id; 既然从普通索引无法直接定位行记录,那 普通索引的查询过程是怎么样的呢? 通常情况下,需要扫码两遍索引树。 这就是所谓的 回表查询 ,先定位主键值,再定位行记录,它的性能较扫一遍索引树更低。 总结:回表查询就是查询时先定位主键值,再定位行记录,会查询2次索引树。   如何实现索引覆盖? 常见的方法是: 将被查询的字段,建立到联合索引里去 。 如将下面第二个查询中sex加入到联合索引中,就不需要回表了。 select id,name from user where name=

项目中常用的MySQL 优化

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

MongoDB基础

可紊 提交于 2019-11-30 13:24:55
MongoDB基础 使用 MongoDb MongoDB语法 数据库语法 表语法 查找数据:find 修改数据update 删除数据 批量操作:for循环 MongoDB 索引 索引基础 唯一索引 索引的一些参数 explain TOC MongoDB基础   MongoDB 是一个介于关系数据库和非关系数据库之间的产品, 是非关系数据库当中功能最丰富,最像 关系数据库的 。他支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类 型。Mongo 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言, 几乎可以 实现类似关系数据库单表查询的绝大部分功能 ,而且还 支持对数据建立索引 。它的特点是 高性能、易部署、易使用,存储数据非常方便 使用 MongoDb 1.新建一个存放数据库的文件夹,注意:不能有中文和空格,建议不要放在 C盘.(E:\data\mongodbData) 2. 启动 MongoDb 服务 mongod --dbpath 文件夹路径 //mongod --dbpath E:\data\mongodbData 注意:以这种方式打开服务,这个cmd就不能关闭了,关闭之后,这个数据库自动关闭. 3. 连接数据库 连接本地数据库:mongo 连接外部数据库:mongo ip地址:端口号 MongoDB语法

索引工作原理

ⅰ亾dé卋堺 提交于 2019-11-30 12:49:49
聚簇索引 每个InnoDB的表都拥有一个索引,称之为聚簇索引,此索引中存储着行记录,一般来说,聚簇索引是根据主键生成的。为了能够获得高性能的查询、插入和其他数据库操作,理解InnoDB聚簇索引是很有必要的。 聚簇索引按照如下规则创建: 当定义了主键后,InnoDB会利用主键来生成其聚簇索引; 如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引; 如果这也没有,InnoDB会隐式的创建一个自增的列来作为聚簇索引。 聚簇索引整体是一个b+树,非叶子节点存放的是键值,叶子节点存放的是行数据,称之为数据页,这就决定了表中的数据也是聚簇索引中的一部分,数据页之间是通过一个双向链表来链接的,B+树是一棵平衡查找树,也就是聚簇索引的数据存储是有序的,但是这个是逻辑上的有序,事实上物理存储可以隔很远,因为数据页之间是通过双向链表来连接,假如物理存储是顺序的话,那维护聚簇索引的成本非常的高。 辅助索引 除了聚簇索引之外的索引都可以称之为辅助索引,与聚簇索引的区别在于辅助索引的叶子节点中存放的是主键的键值。一张表可以存在多个辅助索引,但是只能有一个聚簇索引。 通过辅助索引来查找对应的行记录的话,需要进行两步,第一步通过辅助索引来确定对应的主键,第二步通过相应的主键值在聚簇索引中查询到对应的行记录,也就是进行两次B+树搜索。相反通过辅助索引来查询主键的话,遍历一次辅助索引就可以确定主键了