图片 1

SQL Server(MySql)中的联合主键(联合索引) 索引分析

明天有人问到那个标题,以前也平昔还未有追究联合索引具体采取逻辑,查阅多篇作品,并通过测验,得出某些定论

1.mysql设置后私下认可创制三个root账号密码为空,还大概有mysql组跟mysql客商(能够由此那剖断数据库是否安装成功)

测量试验意况:SQL Server 二零一零 CR-V2

1.1 设置密码

测量试验结果与MySql联合索引查询机制就好像,可以认为MySql是雷同的法则

/usr/bin/mysqladmin -u root password 密码

====================================================

1.2 开机自启

联手索引概念:当系统中某多少个字段常常要做询问,而且数据量相当大,达到百万等第,可八个字段建形成索引

systemctl是CRUISERHEL 7
的劳务管理工科具中要害的工具,它融合此前service和chkconfig(/etc/init.d/)的据守于风流罗曼蒂克体。可以应用它永远性或只在眼下对话中启用/禁止使用服务,升高系统的运转速度。

行使准绳:

老版本

1.最 左
原则,依据索引字段,由左往右依次and(where字段很珍贵,从左往右)

chkconfig  mysql on

2.Or 不会利用联合索引

查看

3.where语句中询问字段富含全部索引字段,字段顺序无关,可随意先后

chkconfig  –list |grep mysql

4.数据量少之甚少时,平时不会选择索引,数据库本人机制会自动决断是不是利用索引

新版本

=====================================================

systemctl  enable  mariadb

测量检验脚本(部分借鉴其余小编的台本):

查看

/*创建测试数据表*/
create table MyTestTable
(
id varchar(10)not null,
parent varchar(40) not null,
addtime datetime default(getdate()),
intcolumn int default(10),
bitcolumn bit default(1)
)
go
/*添加万条随机字符串测试数据耗时分钟*/
declare @count int=3557643
declare @i int =0
declare @id varchar(10),@parent varchar(40)
while(@i<@count)
begin
select @id=left(newid(),10)
if(@i % 20=0)
begin
select @parent=left(newid(),40)
end
insert MyTestTable(id,parent) values(@id,@parent)
select @i=@i+1
end
go

/×未建索引查询测试×/
declare @beginTime datetime =getdate()
declare @elapsedSecond int =0
select * from MyTestTable where parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4' and id='FD3687F4-1'
select @elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())
print '未建立索引时查找数据消耗微秒数'
print @elapsedSecond

select @beginTime=GETDATE()
select * from MyTestTable where parent='F535C18F-BD48-4D45-88DF-9653BB9B422D'
select @elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())
print '未建立索引时查找第二列数据消耗微秒数'
print @elapsedSecond

/*建立索引*/
alter table MyTestTable add constraint PK_id_parent primary key(id asc,parent asc)

/*建立索引后的查询*/
declare @beginTime datetime =getdate()
declare @elapsedSecond int =0
select * from MyTestTable where parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4' and id='FD3687F4-1'
select @elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())
print '建立索引时查找数据消耗微秒数'
print @elapsedSecond

select @beginTime=GETDATE()
select * from MyTestTable where parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'
select @elapsedSecond=DATEDIFF(MICROSECOND,@beginTime,GETDATE())
print '建立索引后查找第二列数据消耗微秒数'
print @elapsedSecond

/*索引使用测试结论*/
select * from MyTestTable where   id='FD3687F4-1' --用索引
select * from MyTestTable where  id='FD3687F4-1' and parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4' and intcolumn>0  --用索引
select * from MyTestTable where  id='FD3687F4-1' and intcolumn>0  and parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4'    --用索引
select * from MyTestTable where  id='FD3687F4-1' and intcolumn>0 --用索引
select * from MyTestTable where parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4' and id='FD3687F4-1'   --用索引

select * from MyTestTable where   parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4' and intcolumn>0   --不用索引
select * from MyTestTable where parent='F92D6A9D-4E9E-4980-8B46-8AD938CEDCB4' or id='FD3687F4-1'   --不用索引

systemctl list-unit-files|grep mariadb.service

如有时常招待留言调换!

查看开机运行所以服务:

ntsysv->图形化,左边有‘*’表示开机自启

1.3 设置字符集utf-8

翻看字符集:show  variables  like “%character%”

设置(配置文件):default-character-set = utf-8

布局文件解读(/etc/my.cnf 出于性能思虑多数暗中同意关闭):

login-bin(二进制日志)->主从复制

log-error(错误日志)->运营关闭及错误消息

文件(/var/lib/mysql/mysql):

frm->表结构

myd->表数据

myi->表索引

询问MySql必得扎实记住其系统布局图,Mysql是由SQL接口,深入分析器,优化器,缓存,存储引擎组成的



图片 1

1 Connectors指的是例外语言中与SQL的互相

2 Management Serveices & Utilities: 系统管理和垄断(monopoly)工具

3 Connection Pool: 连接池。

管制缓冲客商连接,线程管理等须要缓存的要求

4 SQL Interface: SQL接口。

经受客户的SQL命令,并且再次回到客商必要查询的结果。比方select
from就是调用SQL Interface

5 Parser: 解析器。

SQL命令传递到深入解析器的时候会被剖析器验证和解析。深入分析器是由Lex和YACC实现的,是叁个非常长的本子。

最重要功用:

a .
将SQL语句分解成数据结构,并将以此组织传递到持续手续,将来SQL语句的传递和管理便是基于那些布局的

b.  如若在分解构成人中学遭遇错误,那么就表达那些sql语句是不客观的

6 Optimizer: 查询优化器(自动调节)

SQL语句在查询此前会利用查询优化器对查询进行优化。他利用的是“选取-投影-联接”战略实行查询。

用二个例证就足以精晓: select uid,name from user where gender = 1;

其风流倜傥select 查询先遵照where
语句举行抉择,实际不是先将表全体查询出来之后再拓宽gender过滤

以此select查询先依照uid和name实行品质投影,实际不是将品质全部抽出现在再实行过滤

将那四个查询条件联接起来生成最后查询结果

7 Cache和Buffer: 查询缓存。

固然查询缓存有命中的查询结果,查询语句就能够直接去询问缓存中取数据。

以此缓存机制是由黄金时代多级小缓存组成的。譬喻表缓存,记录缓存,key缓存,权限缓存等

8 Engine :存款和储蓄引擎。

积累引擎是MySql中切实的与公事打交道的子系统。也是Mysql最富有特色的三个地点。

Mysql的积累引擎是插件式的。它根据MySql
AB集团提供的文书访问层的多少个硕大而无当接口来定制风流倜傥种文件访问机制(这种访问机制就叫存款和储蓄引擎)

以往有相当多种存储引擎,各类仓库储存引擎的优势各不相仿,最常用的MyISAM,InnoDB,BDB

默许下MySql是选取MyISAM引擎,它查询速度快,有较好的目录优化和数据压缩能力。可是它不支持事业。

InnoDB帮衬专门的学问,况兼提供行级的锁定,应用也一定管见所及。

Mysql也帮忙自个儿定制存款和储蓄引擎,甚至一个库中分歧的表使用差别的积累引擎,那么些都以允许的。

innodb  myisam区别

innodb
支撑外键与实际事务,行锁利于高并发,不唯有缓存索引还只怕有真实数据

性情难点: