mysql创建索引

mysql explain详解

流过昼夜 提交于 2019-12-02 15:36:46
在 explain的帮助下,您就知道什么时候该给表添加索引,以使用索引来查找记录从而让select 运行更快。 如果由于不恰当使用索引而引起一些问题的话,可以运行 analyze table来更新该表的统计信息,例如键的基数,它能帮您在优化方面做出更好的选择。 explain 返回了一行记录,它包括了 select语句中用到的各个表的信息。这些表在结果中按照mysql即将执行的查询中读取的顺序列出来。mysql用一次扫描多次连接(single- sweep,multi-join)的方法来解决连接。这意味着mysql从第一个表中读取一条记录,然后在第二个表中查找到对应的记录,然后在第三个表 中查找,依次类推。当所有的表都扫描完了,它输出选择的字段并且回溯所有的表,直到找不到为止,因为有的表中可能有多条匹配的记录下一条记录将从该表读 取,再从下一个表开始继续处理。 在mysql version 4.1中,explain输出的结果格式改变了,使得它更适合例如 union语句、子查询以及派生表的结构。更令人注意的是,它新增了2个字段: id和 select_type。当你使用早于mysql4.1的版本就看不到这些字段了。 explain结果的每行记录显示了每个表的相关信息,每行记录都包含以下几个字段: id :本次 select 的标识符。在查询中每个 select都有一个顺序的数值。

大白话关系型数据库:索引,事务,锁

瘦欲@ 提交于 2019-12-02 14:53:04
感谢阅读。也欢迎大家可以去看《MySQL技术内幕》和橘黄色的《算法》。 前言 数据库是软件开发的核心,因为一个软件如果要有状态,也就是它记得你什么时候操作过什么,那么数据要持久化,总要存储在某些地方,这些地方也就是数据库。当然,计算机上面的文件夹,文件,你也可以把它当成数据库,也就是文件数据库,现在很火的 hadoop 大数据系统其实就是一个分布式文件数据库。 在没有计算机的年代,记账相关的财务都是用纸来记录的,叫账本。而现在,我们有了计算机,有了编程语言,有了数据库系统,所以我们可以编程,将数据插入数据库,查找出数据库中的数据。 历史的选择,关系型数据库因为很符合人的直觉,所以使用的范围最广。顾名思义,关系型数据库,就是数据之间是有关系约束。在这篇文章中, 关系型数据库 这个词指的是持久化的数据组织形式的综合体,而 关系型数据库管理系统 指的是操纵这些数据组织形式综合体的软件组合。一个是数据本身,一个是操纵数据软件本身。 大白话 关系型数据库,可以包含很多个二维化的数据结构,叫做表,有行列之分,就像棋盘一样。列是字段,比如性别,年龄,姓名,行是一行行记录: 表1: 人口登记表 编号 性别 年龄 姓名 1 男 22 大大 2 女 34 次奥 非常的直观。 每一行记录可以有个主键,不可重复,比如编号,用以区分这行记录。还可以多个表之间有关系约束,叫做外键: 表2: 资产表 编号

mysql:索引

送分小仙女□ 提交于 2019-12-02 14:39:09
MySQL主要有两种结构: Hash索引 B+ Tree索引(InnoDB引擎) B+ Tree索引和Hash索引区别? 哈希索引适合等值查询,但是无法进行范围查询 哈希索引没办法利用索引完成排序 哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题 覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。 索引失效: 没有遵循最左匹配原则(组合索引的第一个字段必须出现在查询语句中) or、!=、not in、is [not] null like '%……' 隐式转换 索引字段应用内部函数或运算 三范式: 原子性:数据列不可再分 每一行数据具有唯一性,并消除数据之间的"部分依赖"(联合主键) 独立性、消除传递依赖 数据库优化: 优化sql 创建索引 分表:水平分表(数据比较多)、垂直分表(字段值比较少使用) 读写分离 缓存:使用redis作为中央缓存,在持久层(dao)和数据库之间添加一个缓存层 慢查询定位: set GLOBAL slow_query_log = ON; set GLOBAL slow

如何优化MySQL千万级大表

风格不统一 提交于 2019-12-02 13:05:53
很好的一篇博客,转载 如何优化MySQL千万级大表 原文链接:: https://blog.csdn.net/yangjianrong1985/article/details/102675334 千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议。 从一开始脑海里开始也是火光四现,到不断的自我批评,后来也参考了一些团队的经验,我整理了下面的大纲内容。 既然要吃透这个问题,我们势必要回到本源,我把这个问题分为三部分: “千万级”,“大表”,“优化”, 也分别对应我们在图中标识的 “数据量”,“对象”和“目标”。 我来逐步展开说明一下,从而给出一系列的解决方案。 1.数据量:千万级 千万级其实只是一个感官的数字,就是我们印象中的数据量大。 这里我们需要把这个概念细化,因为随着业务和时间的变化,数据量也会有变化,我们应该是带着一种动态思维来审视这个指标,从而对于不同的场景我们应该有不同的处理策略。 1) 数据量为千万级,可能达到亿级或者更高 通常是一些数据流水,日志记录的业务,里面的数据随着时间的增长会逐步增多,超过千万门槛是很容易的一件事情。 2) 数据量为千万级,是一个相对稳定的数据量 如果数据量相对稳定,通常是在一些偏向于状态的数据,比如有1000万用户

高性能的索引策略(一)

十年热恋 提交于 2019-12-02 11:41:43
索引有许多有点,比如常见的B-TRee索引,是按照顺序存储数据,索引MySQL可以用来做ORDER BY和GROUP BY操作,因为数据是有序的,所以B-Tree也就会将相关的列值都存储在一起。 当然因为索引中存储了实际的列值,所以有些查询不需要扫描表,只需要索引就可以完成查询(即SELECT column1而不是SELECT *) 。优点总结如下: 索引大大减少了服务器需要扫描的数据量。 索引可以帮助服务器避免排序和临时表。 索引可以将随机I/O变为顺序I/O。 虽然索引优点很明显,但是正确的创建和使用索引也是很关键的,下面介绍一下常见的能提高性能的创建索引方式。 1. 独立的列 查询的时候,要保证查询中的列是独立的,否则MySQL不会使用索引。“独立的列”是指 索引列不能够是表达式的一部分,也不能是函数的参数 。例如下面这个查询无法使用actor_id列的索引: SELECT actor_id FROM sakila . actor WHERE actor_id + 1 = 5 ; 其实WHERE中等价于actor_id = 4,但MySQL不会自动解析。所以我们应该养成简化WHERE条件的习惯, 始终将索引列单独放在比较符号的一侧 。 2. 前缀索引和索引选择性 有时候需要索引很长的字符列,这会让索引变得大且慢,此时通常可以 索引开始的部分字符 ,这样能节省索引空间

写一手好SQL很有必要

与世无争的帅哥 提交于 2019-12-02 11:39:15
MySQL性能 最大数据量 最大并发数 查询耗时0.5秒 实施原则 数据表设计 数据类型 避免空值 text类型 索引优化 索引分类 优化原则 SQL优化 分批处理 不做列运算 避免Select * 操作符<>优化 OR优化 IN优化 LIKE优化 JOIN优化 LIMIT优化 其他数据库   博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是 没有命中索引和没有分页处理 。其实这是非常低级的错误,我不禁后背一凉,团队成员的技术水平亟待提高啊。改造这些SQL的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。 MySQL性能 最大数据量    抛开数据量和并发数,谈性能都是耍流氓 。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 文件系统 单文件大小限制 FAT32 最大4G NTFS 最大64GB NTFS5.0 最大2TB EXT2 块大小为1024字节,文件最大容量16GB;块大小为4096字节,文件最大容量2TB EXT3 块大小为4KB,文件最大容量为4TB EXT4 理论可以大于16TB 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置

mysql 笔记l六

折月煮酒 提交于 2019-12-02 11:21:26
索引分类 普通索引 唯一索引 全文索引 单列索引、多列索引 组合索引 索引的设计原则 索引并非越多越好 避免对经常更新的表进行过多的索引,并且索引列应尽可能少 数据量小的表最好不要使用索引 在条件表达式中经常会用到的不同值较多的列上要建立索引,在不同值少的列上不要建立索引 当唯一性是某种数据本身的特征时,指定唯一索引 在频繁进行排序或分组的列上建立索引,如果带排序的列有多个,可以在这些列上建立组合索引 创建索引 在创建表时创建索引 create table table_name ( Column_definition, [unique | fulltext ] index | key [index_name] (col_name [(len)] [asc | desc] ) ); unique 和 fulltext : 可选参数 分别表示唯一索引和全文索引 全文索引在 5.6 版本以后才支持 index 和 key 为同义词,任选其一,作用相同 index_name col_name :需要创建索引的 字段列 len 索引长度,只有字符串类型的字段才能指定索引长度 create index create [unique | fulltext] index index_name on table_name (col_name [(len)] [asc | desc],..... );

索引

a 夏天 提交于 2019-12-02 11:14:51
一.什么叫索引: 索引就是类似书的目录,提高检索数据的效率。 索引是系统按照某个具体的算法(哈希,散列,二叉树),将数据从全部数据里进行提取,维护成一个索引文件,然后系统在进行数据查询的时候,发现如果查询条件刚好满足索引条件,就可以从索引文件中快速的定位的数据所在位置。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。 ** 二.索引类型包括: 普通索引(index) 对数据没有要求,文件很大,效率比较低,但是查询速度相对较快。 ALTER TABLE 表名字 ADD INDEX index_name ( 需要加索引的列 ) 全文索引(fulltext) 全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR、TEXT列创建,Sysman支持全文索引。MySQL5.6.后InnoDB引擎也加入了全文索引对文本的内容进行分词,因为MySQL提供了支持中文、日文和韩文的内置全文ngram解析器。 具体化 ALTER TABLE 表名 ADD FULLTEXT ( 需要加索引的列 ) 唯一索引(unique key) 唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值(null)。如果是组合索引,则列值的组合必须唯一。创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复。 ALTER TABLE 表名 ADD UNIQUE

elasticsearch 基本概念

北慕城南 提交于 2019-12-02 11:12:59
创建索引库 就是存放索引的数据库, 在索引中创建 映射 put http://localhost:9200/索引库名称 请求体: { "settings":{ "index":{ "number_of_shards":1, "number_of_replicas":0 } } } number_of_shards:设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同 的结点,提高了ES的处理能力和高可用性,入门程序使用单机环境,这里设置为1。 number_of_replicas:设置副本的数量,设置副本是为了提高ES的高可靠性,单机环境设置为0. 如下是创建的例子,创建xc_course索引库,共1个分片,0个副本: 创建映射 就是设置索引中 字段的属性 一旦创建只能增加,不能修改已经创建的 post 请求:http://localhost:9200/xc_course/doc/_mapping { "properties": { "name": { "type": "text" }, "description": { "type": "text" }, "studymodel": { "type": "keyword" } } } 创建文档 ES中的文档相当于MySQL数据库表中的记录。 发送:put 或Post http://localhost

MySQL 性能优化总结

本小妞迷上赌 提交于 2019-12-02 10:53:54
一、影响mysql的性能因素 io: 磁盘IO、随机IO、网络IO 扫描行数 内存、临时表、key cache、query cache cpu:排序、分组查询、distinct查询 事务导致的表锁等 一条慢sql查询消耗的性能 > 1000条快查询消耗的性能。性能优化归根结底就是查询语句的优化,如何写出高效的查询语句呢? 对mysql的索引结构要有一定深度的了解,才能更好的写出高效的查询语句。 二、b+ tree结构索引的特点 b+tree 适应于全键值、键值范围或左前缀匹配查找 支持order by排序 b+ tree 索引不支持跳过索引中的列查找 三、hash结构索引特点 hash索引是基于hash表实现。 全值匹配、只有全键值精确匹配才可以查到,也就是说只有等值比较,如:=、in 不支持范围、部分匹配查找 不支持排序 当hash冲突较多的话,索引维护代价较高,查询性能也会受到影响。 四、聚簇索引的select,没有union和子查询 MySQL innodb存储引擎是基于聚簇索引构建而来,一般是基于主键id构建的b+tree索引和数据行而来, 如果表不存在主键,那么mysql会自动选择其他的非空的索引字段;如果非空索引字段不存在,而mysql内部会自动生成内部的唯一标识作为主键构建聚簇索引。 插入速度严重依赖于插入顺序。当主键不是数值自增长类型,而是varchar类型