表结构-索引

DAY02

一、修改表结构

修改表结构会影响表中已有记录,表结构的修改受表中已有记录的限制。因此要在插入表记录之前修改表结构,若已有记录,在修改前先备份。

默认只有数据库管理员root从数据库服务器本机登录时,才有修改表结构的权限 

1、alter table  数据库名.表名  处理动作;   //修改表结构

处理动作:

1.1添加新字段: add

格式:alter  table  数据库名.表名 add 字段名…

例:

mysql> alter table  数据库名.表名

mysql> add 字段名  字段类型(宽度)  约束条件 after 字段名,

mysql> add 字段名  字段类型(宽度)  约束条件 first,

mysql> add 字段名  字段类型(宽度)  约束条件;

 

first   //把新添加的字段添加在所有字段的上方

after字段名  //把新字段添加在指定字段名的下方

             

默认新添加的字段追加在已有字段末尾first把新添加的字段添加在所有字段的上方,’after字段名’ 把新字段添加在指定字段名的下方

     1.2删除字段: drop   

格式:alter  table  数据库名.表名 drop  字段名;

例:

mysql> alter  table  数据库名.表名

mysql>drop字段名,

mysql>drop字段名;

      1.3修改字段类型:  modify   

格式:alter  table  数据库名.表名  modify  字段名;

mysql> alter  table  数据库名.表名

mysql> modify  字段名  新字段类型(宽度)  约束条件,

mysql>modify 字段名  新字段类型(宽度)  约束条件,

mysql>modify 字段名  新字段类型(宽度)  约束条件;

修改时,修改部分写上新设置,不变的原样写上

1.4修改字段名: change  (既能该名字,又能该类型)

格式:alter  table  数据库名.表名 change 原字段名 新字段名

例:

mysql> alter  table  数据库名.表名

mysql>change原字段名 新字段名字段类型(宽度) 约束条件,

mysql> change 原字段名 新字段名 字段类型(宽度) 约束条件,

mysql> change 原字段名 新字段名 字段类型(宽度) 约束条件;

change 即能改字段名 也能改约束条件 ,如果只改字段名,后面字段类型,约束条件原样落下

 

 

2、alter  table  原表名  rename  to  新表名;   //修改表名

3、create  table  新表名  SQL查询语句;    //复制表  

复制表时,原表中的Key的属性不会复制给新表

例:create table newuserselect * from mysql.user;

4、create table 新表名 没有查询结果的SQL语句; //复制原表的表结构

   SQL查询语句结果为空时,复制表结构

例:create table newuser1select * from mysql.user where host=’12’;

delete  from  表名; //删除所有表记录

drop table 表名;  //删除表

update 表名 set 字段名= where 条件  //更新表记录

例:update yg_tab set yg_id=8 where yg_id=2;

mysql>update mysql.user set host=‘192.168.1.1‘ wherehost=‘192.168.1.10‘;

二、mysql索引类型

1、什么是索引

相当于书的目录,表结构中的Key字段

不同的索引有不同作用,功能,使用规则也不同。

2、索引的优缺点

优点:加快查询表记录速度

缺点:减慢对表记录的写速度(insertupdate delete)、占物理磁盘空间。

默认情况下用.MYI文件存储表索引信息 .MYD存储表记录 .frm存储表结构

3、怎么查看表里是否有索引字段

   查看表结构,desc 表名,再看 key字段是否有值,不同的值代表不同索引类型。

4、怎么看表里的索引信息

    show index from 数据库名.表名   //查看表的索引字段详细信息

# Show create table t9 //查看t9表的建表过程

索引名key_name

索引字段名Column_name

索 引 算法Index_type  (BTREE 、B+TREE、hash)

默认使用的算法是BTREE算法

BTREE算法:二叉树算法

5、mysql支持哪些索引 ,使用说明

      不同的索引类型有不同的功能和约束方式

      使用索引时要满足索引的使用规则

 

什么是索引

索引相当于一本书的目录

优点:加快查询速度

 

缺点 占用空间,减慢更新速度

●普通索引index :一个表中可以把多个字段设置为index字段,

index字段值可以重复,把经常做查询条件的字段设置为index字段,index字段的KEY标志是MUL

创建index字段

  1. 1.   把已有表中的某个字段设置为index字段

Create            index         name                 on                       stu (name);

索引名称(通常和字段重名)         表名(字段名);

Show index from 表名:   \G 换行显示

查看一个表的索引详细信息,默认使用BTREE算法

Drop index 索引名 on 表名

删除索引字段index 属性

BTREE算法又称二叉树算法

Update 表名   set 字段名=值;

Update tea3 settea_id=1;

更新表中对应字段名称为值

  1. 2.   建表时指定索引字段

Create table  表名(字段名 字段类型(宽度) 条件,index(索引字段,索引字段)

默认第一个作为索引名。

mysql> create table tea3(

-> name char(3) notnull,

-> age int(3),

-> index(name),

-> index(age));

二叉树深度= 分开后的高度

●主    键primary key:一个表中只可以有一个主键字段且主键字段的值不可以重复。标志为PRI

当把一个表中的多个字段设置为primary key字段时,叫复合主键,复合主键要在建表之初一起创建。 向表中的复合主键"字段"插值时,只要复合主键"字段的值"不同时重复就可以。

primarykey 通常与auto_increment(自动增长) 连用,作用是让字段值自动增长。每添加一条记录,字段值自动加 +1, 是从当前记录最大值开始

通常把表中查询时能够唯一定位一条记录的字段设置为primary key 字段。

加auto_increment属性字段类型要是整型数值类型 只有primary key 才可以使用auto_increment属性。

如果不是主键不能设置auto_increment。(auto_increment 自动增长,字段类型是整数型)

通常把编号字段作为主键,自动增长的初始值是零

让字段的值自动增长要满足如下条件”

  1. 1.  字段类型必须是整形数值类型
  2. 2.  必须是主键字段  (仅主键可设置自动增长,主键可不设置自动增长
  3. 3.  Createtable tea5(

Id int(3)primary key,

Namechar(3),

Age int(3)

);

复合主键  复合主键要在建表之初一起创建

 

●外    键foreign key:外键就是表与表之间做关联,让当前表里字段的值受另一表里字段值限制

外键的使用规则?建外键条件:(1)表的存储引擎要是innodb存储引擎

(2)外键字段的类型要一致

(3)被参考字段要有明确的索引(index,primary key)7,

也就是必须要建索引。

具有外键属性的字段不能直接删除,表可以删除。子表中一个字段可以参考不同父表中的字段(插入

的数据必须在两个父表中都存在)。子表中的不同字段也可以参考不同父表中的字段(插入的数据必

须在两个父表中分别存在)。若要删除父表,需先删除子表的外键约束。

建表:

Createtable tab_name(字段)engine=innodfb;   // 建表设置存储引擎

创建外键: 在下方

      全文索引 fulltext:

唯一索引unique:

使用规则:

一个表中可以有多个unique字段,unique字段值不可以重复,unique字段key标志是UNI,unique字段值允许为NULL,当修改为不允许为NULL时,则字段限制与主键相同。

           设置唯一索引

create  uniqueindex 索引名 on 表名(索引字段)

create  unique index tea_id on tea3(tea_id)

建表时建立

Create table tea4(

Tea_id int(3)not null,

Name char(3)not null,

Age   int(3) not null,

Sex   enum(“m“,”w”),

Index (name),

Unique(tea_id));

 

6、如何在表里设置索引字段

(1)建表时创建索引字段

1)设置index字段、unique字段

create table stu(

stu_id  varchar(10),

name varchar(10) not null ,

age  tinyint(3)unsigned,

sex  enum(“boy”,”girl”),

index (name,sex), //默认把第一个作为索引名,这是需要用show index from 数据库名.表名  显示详细索引信息。

unique(stu_id)

);

2)设置主键


create    table t1(

id int(2) primary key,

name    varchar(9),

age    int(2)

);

创建复合主键  (只能在建表之初创建)

create table t2 (

ip varchar(15),

port varchar(5),

sername varchar(10),

status enum(‘deny’,’allow’) default ‘deny’,

primary key(ip,port)

);

mysql> create table ser (

-> c_ip char(15),

-> ser_nvarchar(15),

-> portchar(5),

-> statusenum("allow","deny") default "deny",

-> primarykey(c_ip,port)

-> );

3)创建外键

Createtable tab_name(字段)engine=innodfb;   // 建表设置存储引擎

 

foreign key (当前表里字段名) references 表名(表名里的字段名)

on updatecascade   //同步更新  on delete cascade    //同步删除  这两个之间用空格隔开。

Create  tablegz_tab(

Gz_id int(3) not null ,

Show create  table  表名

删除外键

Alter table  表名drop foreign key 外键名

delete from 表名; // 删除表中所有记录

where 字段名=值;

在已有表中添加索引字段

1)添加index字段

create index 索引名 on 表名(字段名列表);  //通常索引名与字段名同名

例:create index name on stu(name);

create index sexon stu(sex);

2)添加unique字段   //若表记录中unique字段值不唯一,则不成功

createunique index 索引名 on 表名(字段名列表);

例:create unique index stu_id on stu(stu_id);

3)添加主键  //若表记录中主键字段值有NULL,则不成功

alter table 表名 add primary key(字段名);

例:delete from t1 where id is null;  //删除t1表中id值为空的记录

alter table t1 addprimary key(id);

alter table t1 modify id int(2) not null auto_increment;//主键通常与auto_increment 连用

4)添加外键

alter table 子表名 add foreign key(字段名) references 父表名(字段名);//当子表字段下有值并不在父表中时,添加不成功

7、如何删除表中字段的索引属性

    1)删除index索引、unique索引

drop index 索引名 on 表名;

例:drop  index  name  on stu;

drop  index  stu_id on  stu;

2)删除主键  若有auto_increment,需先删除自动增长

alter table t1 modify id int(2) notnull;   修改id字段的约束条件

alter table t1 drop primary key;   //删除主键

3)删除外键

alter table t1 drop foreign key  外键名;  //通过show create table表名查看外键名

例:altertable t1 drop foreign key  t_ibfk_1;

三、mysql存储引擎

     1) MyISAM特点:支持表级锁定,不支持行级锁定,不支持事务,独享表空间,多用在查询、插入较多的表。

相关的表: XXX.frm 存放的表结构  XXX.MYI  索引信息   XXX.MYD表中的数据 记录

2)innodb支持事务和事务回滚, 支持表级/行级锁定 共享表表空间

事务= 一次sql操作从开始到结束的过程

xxx.frm 存储表结构

xxx.ibd 存储数据

索引和记录用同一个文件存储/var/lib/mysql/ibdata1,ibdata1在服务初始化时生成,10M,用完后,服务器自动增大)

事务:一次SQL操作从开始执行到正确执行结束的过程

事务回滚:ib_logfile0  ib_logfile1

set autocommit=0;  // 关闭自动提交功能

start transaction; //开启事务

create table 30(id int) engine=innodb;

insert into t30 values(200);

select * from t30;

在另一终端查看(事务未提交,查看不到)

rollback;   //回滚

insert into t30 values(100);

commit;//提交,事务结束,永久生效

3)myisam支持表锁,innodb支持行锁

锁机制:解决用户的并发访问冲突问题

锁粒度:表锁-并发访问量低 系统开销小

行锁-并发访问量高  系统开销大

页级锁:对整个页面(MySQL管理数据的基本存储单位)进行加锁

锁类型:写锁(delete update insert)互斥锁、排它锁特点:独占锁,上锁期间其他线程不能读表或写表

读锁(select desc show)共享锁特点:支持并发读,写操作被锁

幻读(两次读出的数据不同)与脏读(从内存读出的数据)

死锁:锁超时

写锁优先级高于读锁*

获取写锁时,其他操作均需等待写锁释放后执行。

查看当前的锁状态

查看table_lock开头的变量,% 作通配符

show status like ‘ table_lock% ’;

时间: 2024-11-10 08:02:44

表结构-索引的相关文章

mysql数据库性能优化(包括SQL,表结构,索引,缓存)

优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段.降低 CPU 计算除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了.order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算).当我们的 IO 优化做到一定阶段之后

mysql表结构表空间和索引的查询

1.查询表的结构信息 Sql代码 desc tableName; show columns from tableName; describe tableName 上面的结果返回的结果是一样的. 2 查询表的列信息. Sql代码 select * from information_schema.columns where table_name='tableName'; 3 查看库中所有的库 Sql代码 SELECT LOWER(schema_name) schema_name FROM infor

SQL优化的四个方面,缓存,表结构,索引,SQL语句

一,缓存 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO. query_cache_size/query_cache_type (global) Query cache 作用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条S

MySQL索引、字符编码、表结构

一.索引: 就是用来提高搜索性能的 只有我们数据量非常大的时候,索引可以展现出它的优势来! 注意:索引,我们在添加了以后,不用刻意的去使用它,它会自动生效 1. 常规索引(index):没有任何限制,就是普通的索引 1> 在建表时创建普通索引 create table t1( id int unsigned not null, name varchar(32), index id(id) // index 索引名(字段名) ); 2> 在建表之后给表字段添加普通索引 create index

oracle中查看当前用户的表结构、主键、索引

1.查询表的所有列及其属性 select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name = c.table_name and t.column_name = c.column_name and t.table_name = 要查询的表 2.查找表的所有索引(包括索引名,类型,构成列) select t.*,i.index_type from user_ind_columns t,user

SQL Server 表和索引存储结构

在上一篇文章中,我们介绍了SQL Server数据文件的页面类型,系统通过96个字节的头部信息和系统表从逻辑层面上将表的存储结构管理起来,具体到表的存储结构上,SQL Server引入对象.分区.堆或B树.分配单元等概念. 下图显示了表的存储组织,每张表有一个对应的对象ID,并且包含一个或多个分区,每个分区会有一个堆或者多个B树,堆或者B树的结构是预留的.每个堆或者是B树都有三个分配单元用来存放数据,分别是数据.LOB.行溢出,使用最多的分配单元是数据.如果有LOB数据或者是长度超过8000字节

查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数

查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06|  分类: SQL SERVER|举报|字号 订阅 (1)查询SQLServer2005中某个数据库中的表结构 SELECT TOP 100 PERCENT --a.id,CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,CASE WHEN a.colorder = 1 THEN isnull(f.v

优化的四个方面,缓存,表结构,索引,SQL语句

一,缓存 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO. query_cache_size/query_cache_type (global) Query cache 作用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条S

oracle命令查看表结构及表索引

--查看oracle数据库的单个表结构 select dbms_metadata.get_ddl('TABLE','TABLE_NAME') from dual; 括号里面有两个参数,第一个参数是我们要查询的对象,这里查的是表结构,所以是'TABLE'. 第二个参数是我们要查的表的表名,这里的表名必须大写. 注意:执行完上面这条语句你可能只是看到整个建表语句的一部分,因此我们在执行命令的时候可以加上下面的语句: SQL> SET LONG 3000SQL> SET PAGESIZE 0SQL&