mysql创建索引

一文读懂之SQL数据库基础

末鹿安然 提交于 2019-12-22 01:58:07
关系型数据库和非关系型数据库(NoSQL)数据库: 关系型数据库,指的是以关系的形式来存储和管理的数据库系统,特点是: 1)以表格的形式保存数据 mysql视图: 视图:是一张基于表格或其他视图生成的虚拟的表,通常被称为虚表。 视图中不存放任何数据,存放的是查询表格的语句。当操作视图时,相当于视图帮忙去操作表格。 作用: 1)限制用户对表格数据的访问,控制表格数据的局部访问。 2、可以实现同一张表格中数据的不同显示。 3、可以对复杂的查询简单化。 数据库索引:Index,是为了提高数据库查询效率而产生的一个对象。一个形象的比喻,有了索引的Mysql就是一辆兰博基尼,没有索引的Mysql就是一个人力三轮车。 特点:索引能提高查询的效率,但是,会降低增删改的效率,因为增删改数据后,因此导致增删改的效率会变低。所以并不是每一列都需要加索引的。 哪些列需要加索引?通常列具有唯一性的可以添加索引。主键/唯一键,Oracle默认给主键和唯一键加上了索引。 -- 创建索引 create index inx_id on tb_class ( id ) ; create index 索引名 on 表名(列名) ; -- 索引创建好后,在后续的所有的查询的where子句中,一但使用该条件,就会自动生效 select * from tb_class where id = 2 ; --

MySQL 索引建立原则

房东的猫 提交于 2019-12-21 20:23:58
MySQL 索引设计原则: (1)对于经常查询的字段,建议创建索引。 (2)索引不是越多越好,一个表如果有大量索引,不仅占用磁盘空间,而且会影响INSERT,DELETE,UPDATE等语句的性能。 (3)避免对经常更新的表进行过多的索引,因为当表中数据更改的同时,索引也会进行调整和更新,十分消耗系统资源。 (4)数据量小的表建议不要创建索引,数据量小时索引不仅起不到明显的优化效果,对于索引结构的维护反而消耗系统资源。 (5)不要在区分度低的字段建立索引。比如性别字段,只有 “男” 和 “女” ,建索引完全起不到优化效果。 (6)当唯一性是某字段本身的特征时,指定唯一索引能提高查询速度。 (7)在频繁进行跑排列分组(即进行 group by 或 order by操作)的列上建立索引,如果待排序有多个,可以在这些列上建立组合索引。 MySQL 索引未命中情况: (1)范围问题,条件中出现这些符号或关键字:>、>=、<、<=、!= 、between...and...、like等,如果查询范围不明确,达不到优化效果。 没有指定范围不会用到索引: select name from s1; 大于号、小于号范围过大: 不等于!= between ...and... like,如果以%开头,不会用到索引: (2) 索引列不能参与计算,保持列“干净”。 比如from_unixtime(create

MYSQL 什么时候用单列索引?什么使用用联合索引?(收集)

陌路散爱 提交于 2019-12-21 19:58:02
MYSQL 什么时候用单列索引?什么使用用联合索引?(收集) 我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在name和age上创建 单列索引呢? 多个字段查询什么情况下用联合索引 什么时候分别创建单列索引呢? 1,首先要确定优化的目标,在什么样的业务场景下,表的大小等等。如果表比较小的话,可能都不需要加索引。 2,哪些字段可以建索引,一般都where、order by 或者 group by 后面的字段。 3,记录修改的时候需要维护索引,所以会有开销,要衡量建了索引之后的得与失。 学生表,可以认为name的重复度比较小,而age的重复度比较大,对于单列索引来说,比较适合建在重读度低的列上。 对于select * from students where name='张三’and age=18; 题主所说的两种情况 A. name 和 age 各自单独建立索引。 一般来说mysql会选择其中一个索引,name的可能性比较大,因为mysq会统计每个索引上的重复度,选用低重复度的字段。另外一个age的索引就不会用到,但还有维护索引的开销,所以age的索引不需要创建。 B. name和age的联合索引 这种索引的切合度最好,mysql会直接选用这个索引。但相对单独的name索引来说

高性能Mysql笔记 — 优化

依然范特西╮ 提交于 2019-12-21 16:42:27
性能优化 了解查询的整个生命周期,清楚每个阶段的时间消耗情况 性能分析 慢查询日志——服务器性能分析 参考 慢查询日志是优化很重要的手段,但是开启慢查询日志对性能的影响并不大,所以可以考虑在线上打开慢查询日志 查看慢查询是否打开、以及日志存储位置:show variables like '%slow%' 统计当前数据库连接状态 mysql -e 'show processlist \G' -uroot -proot | grep State | sort | uniq -c | sort -rn 剖析单条查询 select @@profiling:查看profiling是否打开 set profiling=1:打开profiling show profiles:查看每条查询的性能 show profile for query id:查看query id的详细时间花费 information_schema.profiling:该表存储了每个query的详细时间花费 show status:查看会话级别的计数器 show global status:查看全局的计数器 show status where variable_name like '%handler%':查看某些变量的计数 查询性能优化 查询由多个子任务组成,优化查询也就是优化子任务 消除一些子任务 减少子任务执行次数

滴滴从KV存储到NewSQL实战

不羁岁月 提交于 2019-12-21 04:29:51
0.导读 本文讲诉滴滴在分布式Nosql存储Fusion之上构建NewSQL的实践之路。详细描述Fusion-NewSQL的特性,应用场景,设计方案。 1.背景 Fusion-NewSQL是由滴滴自研的在分布式KV存储基础上构建的NewSQL存储系统。Fusion-NewSQ兼容了MySQL协议,支持二级索引功能,提供超大规模数据持久化存储和高性能读写。 ▍我们的问题 滴滴的业务快速持续发展,数据量和请求量急剧增长,对存储系统等压力与日俱增。虽然分库分表在一定程度上可以解决数据量和请求增加的需求,但是由于滴滴多条业务线(快车,专车,两轮车等)的业务快速变化,数据库加字段加索引的需求非常频繁,分库分表方案对于频繁的Schema变更操作并不友好,会导致DBA任务繁重,变更周期长,并且对巨大的表操作还会对线上有一定影响。同时,分库分表方案对二级索引支持不友好或者根本不支持。鉴于上述情况,NewSQL数据库方案就成为我们解决业务问题的一个方向。 ▍开源产品调研 最开始,我们调研了开源的分布式NewSQL方案:TIDB。虽然TIDB是非常优秀的NewSQL产品,但是对于我们的业务场景来说,TIDB并不是非常适合,原因如下: 我们需要一款高吞吐,低延迟的数据库解决方案,但是TIDB由于要满足事务,2pc方案天然无法满足低延迟(100ms以内的99rt,甚至50ms内的99rt) 我们的多数业务

1.SQL数据定义语言(基础)

余生长醉 提交于 2019-12-21 02:07:57
1.创建数据库 CREATE Database database_name; 习惯Sql语句中,保留的关键字否设置为大写,数据库、表、字段为小写。 2.创建数据表 创建数据表基本语法 CREATE TABLE 表名( 列名1 类型 [NOT NULL,UNIQUE,DEFAULT value,PRIMARY KEY,CONSTRAINT foregin_name foregin key(column) references outer_table_name(column) on Delete RESTRICT|CASCADE|SET NULL] ); 说明 1.中括号中的内容为可选项目 2.常用的列数据类型有 INT、SMALLINT、FLOAT、DATE、DATETIME、VARCHAR(n)、CHAR(n)等 3.NOT NULL 设置值不能为NULL、UNIQUE设置值不能重复 4.PRIMARY KEY设置为主键 只有外键可以设置为auto_increment 5.CONSTRAINT外建名 references outer_table_name(列值) on Delete|Update RESTRICT|CASCADE|SET NULL] 设置外键 restrict主表中数据不能删除数据、CASCADE主表中被删除那么引用为外键值对的表格也删除

mysql面试题狂刷(四)

丶灬走出姿态 提交于 2019-12-20 18:21:43
1.数据库完整性约束 实体完整性、参照完整性、用户自定义完整性 2.存储过程、触发器、函数的区别 触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。 本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少 1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 2)对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 3

Python day 44 :数据库的存储引擎/索引/权限管理

感情迁移 提交于 2019-12-20 10:18:14
## 存储引擎 ```python 分类: Innodb: 1,默认版本5.5及以上 2,支持事务 3,不支持全文索引(MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;) 4,索引和数据都是在同一个文件中: .ibd 表的结构在.frm文件中 MyIsam: 1,默认版本在5.5以下 2,不支持事务 3,支持全文索引 4,表结构:.frm 表数据:.MYD 表索引:.MYI 全文所以插件:sphinx. ``` ## 索引 ```python 作用: 加快查询的速度 类比: 新华字典的目录, 可以将索引理解成一个特殊的文件, 然后如果没有这个文件的话, 查询是从前到后查找数据的,如果有这个文件的话, 会按照一种特殊的数据结构(二叉树)查找数据 分类: 主键索引: 加快查询 + 不能重复 + 不能为空 primary key 唯一索引: 加快查询 + 不能重复 unique(列名) 联合唯一索引: 加快查询 + 不能重复 unique(列名1,列名2) 普通索引: 加快查询 index('列名') 主键索引创建: 第一种:create table ti(id int auto_increment primary key,name varchar(32) not null default "")engine=Innodb charse=utf8

MySQL 优化技巧

柔情痞子 提交于 2019-12-20 08:48:12
MySQL优化三大方向: 1 优化MySQL所在服务器内核(此优化一般由运维人员完成)。 2 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整。 3 对SQL语句以及表优化。 MySQL参数优化: 1 MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看 mysql > show variables like 'max_connections' ; + -- -- -- -- -- -- -- -- - + -- -- -- - + | Variable_name | Value | + -- -- -- -- -- -- -- -- - + -- -- -- - + | max_connections | 500 | + -- -- -- -- -- -- -- -- - + -- -- -- - + 1 row in set ( 0.00 sec ) 2 当前连接的线程的个数 mysql > show status like 'threads_connected' ; + -- -- -- -- -- -- -- -- -- - + -- -- -- - + | Variable_name | Value | + -- -- -- -- -- -- -- -- -- - + -- -- -- - + |

Mysql数据库的索引和视图详解

感情迁移 提交于 2019-12-19 23:24:44
Mysql数据库的索引和视图详解 索引的概念 数据库的索引与书籍中的目录类似 在一本书中,无需阅读整本书,利用目录就可以快速查找所需信息 书中的目录是一个词语列表,其中注明了包含各个词的页码 数据库索引 在数据库中,索引数据库程序无需对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引是某个表中一列或若干列的集合,以及物理标识这些值的数据页的逻辑指针清单 索引的作用 设置了合适的索引之后,数据库利用葛总快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本 通过创建唯一索引保证数据表数据的唯一性 可以加快表与表之间的连接 在使用分组和排序时,可大大减少分组和排序时间 索引分类 普通索引 这是最基本的索引类型,而且它没有唯一性的限制 唯一性索引 索引的列的所有值都只能出现一次,即必须唯一 主键 主键是一种唯一性索引,但它必须指定为“PRIMARY KEY” 全文索引 全文索引可以在VARCHAR或者TEXT类型的列上创建 创建索引的原则依据 表的主键,外键必须有索引 数据量超过300行的表应该有索引 经常与其他表进行连接的表,在连接字段上应该建立索引 唯一性太差的字段不适合建立索引 更新太频繁的字段不适合创建索引 经常出现在Where字句中的字段,特别是大表的字段