mysql 数据库相关操作

进入到mysql 数据库命令:

mysql -uusername -ppassword

通过sql文件向数据库导入表或者数据命令:

use database    //需要导入到哪个数据库

source  /path/xxxx.sql      //导入sql 文件

Mysql 常用的命令

  1. show processlist  展示进程相关的信息
  2. FROM_UNIXTIME(时间戳) 将时间戳转换成日期格式
  3. UNIX_TIMESTAMP(日期) 将日期格式转换成时间戳
  4. TRUNCATE 表名  删除表中的信息,编号从 0 开始计算
  5. group by 分组  REPLACE(GROUP_CONCAT(t.health),',',',') as healths, 将分组中的数据填入列healths 原值用逗号“,”隔开,示例:

select  t.timestamp ,t.step,

 

REPLACE(GROUP_CONCAT(t.area),',',',') as areas,

 

REPLACE(GROUP_CONCAT(t.health),',',',') as healths,

 

REPLACE(GROUP_CONCAT(t.busy),',',',') as busys

 

from t_network t where t.step=300 and t.`timestamp`>1556208000 and t.`timestamp`<=1556294400

 

GROUP BY t.`timestamp`;

     6.create view 视图名,创建视图,示例:

create view v_network as 

select 

`id`,

`timestamp`,

from_unixtime(timestamp) as time,

`area`,

`step`,

`health`,

`busy`,

`created_time`,

`created_by`,

`last_modified_time`,

`last_modified_by`

from t_network;

     7.存储过程的创建:

DELIMITER ;;

CREATE DEFINER=`root`@`localhost` PROCEDURE `add_test_data`(IN area varchar(10) charset utf8)

BEGIN

  DECLARE i int;

  DECLARE t1 bigint default 1556264820;

  DECLARE health1 , busy1 double DEFAULT 0.5;

  DECLARE traffic_in1,traffic_out1,loss1,avg1,min1,max1,dev1 double default 3;

  set i = 0;

  while i < 1000000 do

  set health1 = rand();

  set busy1 = rand();

  set traffic_in1 = rand()*2946045983;

  set traffic_out1 = rand()*1946045983;

  set loss1 = rand()+1;

  set avg1 = rand();

  set min1 = rand()+3;

  set max1 = rand()+5;

  set dev1 = rand();

 

  INSERT INTO `t_network_stats` ( `timestamp`, `area`, `range_step`, `health`, `busy`, `traffic_in`, `traffic_out`, `loss`, `avg`, `max`, `dev`, `min`)

VALUES

(t1, area, 60, health1, busy1, traffic_in1, traffic_out1, loss1, avg1, max1, dev1, min1);

    set i=i+1;

    set t1 = t1 + 60;

  end while;

END;;

DELIMITER ;

      8. mysql中的if 语句

If(boolean ,  value1,  value2)  

boolean 为true返回 value1中的值,boolean为false 返回alue2示例:

select

if(false,(max(timestamp) - max(timestamp) % 600), (max(timestamp) - 28800 - max(timestamp) % 86400)) as max_timestamp

from t_network_stats where range_step=60

 Mysql数据库索引

索引是在存储引擎中实现的,也就是说不同的存储引擎会使用不同的索引

           MyISAM和InnoDB存储引擎,只支持BTREE索引,也就是默认使用的是BTREE,不能更换。

           MEMORY/HEAP 存储引擎,支持HASH和BTREE索引

数据库索引,分为单列索引(主键索引,唯一索引,普通索引)和组合索引,全文索引和空间索引。

单列索引:一个索引只包含一个列,一个表可以有多个单列索引

组合索引:一个组合索引包含两个或两个以上的列

索引的创建

1、单列索引:

      1-1普通索引:create index indexname on tablename(字段名[length])  或者是  alter table tablename add index indexname(字段名[length])

示例:create index account_index on award(account);

Alter table award add index account_index(account);

      1-2 唯一索引:唯一索引要求所有的类的值是唯一的,允许是空值;create unique index on tablename(字段名[length]);或者  alter table tablename add unique(column_list)

示例:create unique index account_unique_index on award(account);

       1-3 主键索引,不允许有空值(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位),主键索引建立的规则是int优于varchar,一张表中只能有一个主键,被标识为自动增长的字段一定是主键,但是主键不一定自动增长。一般把主键定义在无意义的字段上,主键的数据类型最好是数值。Alter table tablename add primary key (列的列表)

2、组合索引

在表中的多个字段组合上创建的索引,只有在查询条件使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。

 

3、··全文索引:mysql 从3.23.23 版开始支持全文索引和全文检索,在mysql中,全文索引的索引类型为fulltext,全文索引可以在varchar 或者text类型的列上 创建,它可以通过create table 命令来创建,也可以通过alter table 或 create index 命令创建,对于大规模的数据集,通过alter table(或者create index)命令创建全文索引要比把记录插入带有全文索引的空表更快。

 

4、空间索引

空间索引是对空间数据类型的字段 建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON,在创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM ,创建空间索引的列,必须将其声明为NOT NULL。

 

单列索引与多列索引的优劣

如果在firstname、lastname、age这三个列上分别创建单列索引,效果低于创建一个firstname、lastname、age的多列索引

索引选取的规则:

1、选择维度高的列

2、选择 where,on,group by,order by 中出现的列

3、选择较小的数据列,这样的索引文件更小,同时可装载更多的索引键

4、为较长的字符串使用前缀索引

5、组合索引能减低索引文件的大小,使用速度也优于多个单列索引

6、切勿滥用索引,因为除了磁盘空间的开销外,每次增删改都需要重新建立索引

7、索引不会包含有NULL值的列(若组合索引包含NULL值的列则整个组合索引无效)

 

查看是否使用了索引进行查询:

EXPLAIN SELECT * FROM t_network_stats WHERE idx_timestamp = 1990\G

1、id:SELECT标识符,这是SELECT的查询序列号,也就是一条语句中,该select是第几次出现,在该语句中,select就只有一个,所以是1

2、Select_type : 所使用的select查询的类型,

Simple:表示为简单的select ,不使用union或子查询,就是简单的select。那么该select查询时会使用索引。

PRIMARY:最外面的select在拥有子查询时,就会出现两个以上的select。

Union:两张表连接中的第二个或后面的select语句

SUBQUERY :在子查询中,第二个select

3、talbe:数据表的名字,按照被读取的先后顺序排列

4、type:指定本数据表和其他数据表之间的关联关系,该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录联合。Ref用于连接程序使用键的最左前缀或者是该键不是primary key 或unique 索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是 一个不错的连接类型。其他取值:system、const、eq_ref、index和all

5、possible_keys :Mysql在搜索数据记录时可以选择各个索引,该表中就只有一个索引,idx_step

6、key:实际选用的索引

7、key_len :显示了mysql使用索引的长度(也就是索引的个数),当key字段的值为null 时,索引的长度就是null,注意,key_len的值可以告诉你在联合索引中mysql会真正使用了哪些索引。

8、ref:给出关联关系中另一个数据表中数据列的名字。常量(const)

9、rows:MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。

10、extra:提供了与关联操作有关的信息,没有则什么都不写。  

 

Mysql 的外键约束:

外键的使用需要满足下列的条件:

  1. 两张表必须都是InnoDB表,并且它们没有临时表。

  2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。

  3. 建立外键关系的对应列必须建立了索引。

  4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

  如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:

  1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

  2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。

  3. NO ACTION: InnoDB拒绝删除或者更新父表。

  4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。

  5. SET DEFAULT: InnoDB目前不支持。

  外键约束使用最多的两种情况无外乎:

  1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

  2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

发布了35 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tealala/article/details/93190943