mariadb视图、存储过程、函数、触发器以及存储引擎异同

1、描述视图,存储过程,函数,触发器分别是什么

  • 视图:
    • VIEW,虚表,用来保存有实表的查询结果
MariaDB [hellodb]> select * from students;                      #查看students表中的数据
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |
|     2 | Shi Potian    |  22 | M      |       1 |         7 |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |
|     6 | Shi Qing      |  46 | M      |       5 |      NULL |
|     7 | Xi Ren        |  19 | F      |       3 |      NULL |
|     8 | Lin Daiyu     |  17 | F      |       7 |      NULL |
|     9 | Ren Yingying  |  20 | F      |       6 |      NULL |
|    10 | Yue Lingshan  |  19 | F      |       3 |      NULL |
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
|    15 | Duan Yu       |  19 | M      |       4 |      NULL |
|    16 | Xu Zhu        |  21 | M      |       1 |      NULL |
|    17 | Lin Chong     |  25 | M      |       4 |      NULL |
|    18 | Hua Rong      |  23 | M      |       7 |      NULL |
|    19 | Xue Baochai   |  18 | F      |       6 |      NULL |
|    20 | Diao Chan     |  19 | F      |       7 |      NULL |
|    21 | Huang Yueying |  22 | F      |       6 |      NULL |
|    22 | Xiao Qiao     |  20 | F      |       1 |      NULL |
|    23 | Ma Chao       |  23 | M      |       4 |      NULL |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)
MariaDB [hellodb]> CREATE VIEW V_STUDENTS AS SELECT STUID,NAME,AGE FROM students WHERE Gender='M';                                          #创建视图view,名为V_STUDENTS
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> SHOW TABLE STATUS LIKE 'V_STUDENTS'\G                #查看视图状态
*************************** 1. row ***************************
           Name: V_STUDENTS
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)
MariaDB [hellodb]> DESC V_STUDENTS;                         #查看视图表结构
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| STUID | int(10) unsigned    | NO   |     | 0       |       |
| NAME  | varchar(50)         | NO   |     | NULL    |       |
| AGE   | tinyint(3) unsigned | NO   |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
MariaDB [hellodb]> SELECT * FROM V_STUDENTS;                #查看视图中的数据
+-------+---------------+-----+
| STUID | NAME          | AGE |
+-------+---------------+-----+
|     1 | Shi Zhongyu   |  22 |
|     2 | Shi Potian    |  22 |
|     3 | Xie Yanke     |  53 |
|     4 | Ding Dian     |  32 |
|     5 | Yu Yutong     |  26 |
|     6 | Shi Qing      |  46 |
|    11 | Yuan Chengzhi |  23 |
|    13 | Tian Boguang  |  33 |
|    15 | Duan Yu       |  19 |
|    16 | Xu Zhu        |  21 |
|    17 | Lin Chong     |  25 |
|    18 | Hua Rong      |  23 |
|    23 | Ma Chao       |  23 |
|    24 | Xu Xian       |  27 |
|    25 | Sun Dasheng   | 100 |
+-------+---------------+-----+
15 rows in set (0.00 sec)
MariaDB [hellodb]> SHOW CREATE VIEW V_STUDENTS\G                #查看视图创建过程
*************************** 1. row ***************************
                View: V_STUDENTS
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `V_STUDENTS` AS select `students`.`StuID` AS `STUID`,`students`.`Name` AS `NAME`,`students`.`Age` AS `AGE` from `students` where (`students`.`Gender` = 'M')
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
MariaDB [hellodb]> UPDATE hellodb.V_STUDENTS set AGE='30' where NAME='Shi Zhongyu';
Query OK, 1 row affected (0.00 sec)                             #更改视图中的数据,等于是对原表数据进行操作,会对原始数据产生影响
Rows matched: 1  Changed: 1  Warnings: 0
MariaDB [hellodb]> SELECT * FROM V_STUDENTS WHERE STUID=1;                      
+-------+-------------+-----+
| STUID | NAME        | AGE |
+-------+-------------+-----+
|     1 | Shi Zhongyu |  30 |
+-------+-------------+-----+
1 row in set (0.00 sec)
MariaDB [hellodb]> select * from students where STUID=1;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu |  30 | M      |       2 |         3 |
+-------+-------------+-----+--------+---------+-----------+
1 row in set (0.00 sec)
MariaDB [hellodb]> DROP VIEW  V_STUDENTS;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> SHOW TABLES;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+
7 rows in set (0.00 sec)
  • 函数
    • 系统函数
    • 自定义函数(user-defined function UDF)
      • 保存再mysql.proc表中
      • 创建UDF
        • CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL}
        • 参数可以有多个,也可以没有参数,必须有且只有一个返回值
MariaDB [hellodb]> create function simplefun() returns varchar(20) return "test function!";
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)                #创建函数时若开启了二进制日志功能则需要将log_bin_trust_function_creators设置为1,否则会报错
MariaDB [hellodb]> set global log_bin_trust_function_creators=1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> create function simplefun() returns varchar(20) return "test function!";             #创建一个无参函数,名称为simplefun,使用select调用后会返回字符串test function!
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> select * from mysql.proc\G;
*************************** 1. row ***************************
                  db: hellodb
                name: simplefun
                type: FUNCTION
       specific_name: simplefun
            language: SQL
     sql_data_access: CONTAINS_SQL
    is_deterministic: NO
       security_type: DEFINER
          param_list: 
             returns: varchar(20) CHARSET utf8
                body: return "test function!"
             definer: root@localhost
             created: 2019-06-16 14:59:36
            modified: 2019-06-16 14:59:36
            sql_mode: 
             comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
        db_collation: utf8_general_ci
           body_utf8: return "test function!"
1 row in set (0.00 sec)
MariaDB [hellodb]> show create function simplefun\G;
*************************** 1. row ***************************
            Function: simplefun
            sql_mode: 
     Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION `simplefun`() RETURNS varchar(20) CHARSET utf8
return "test function!"
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
MariaDB [hellodb]> select simplefun();                      #调用创建的函数
+----------------+
| simplefun()    |
+----------------+
| test function! |
+----------------+
1 row in set (0.00 sec)
MariaDB [hellodb]> drop function simplefun;             #删除创建的函数
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> DELIMITER //                         #更改结尾符号
MariaDB [hellodb]> CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20)                    #创建一个有参函数,调用时传递一个uid,会删除uid对应的行并返回剩下行的行数
    -> BEGIN
    -> DELETE FROM students WHERE stuid = uid;
    -> RETURN (SELECT COUNT(stuid) FROM students);
    -> END//
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> DELIMITER ;
MariaDB [hellodb]> show function status\G;
*************************** 1. row ***************************
                  Db: hellodb
                Name: deleteById
                Type: FUNCTION
             Definer: root@localhost
            Modified: 2019-06-16 15:15:50
             Created: 2019-06-16 15:15:50
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)
MariaDB [hellodb]> select deleteById(1);         
+---------------+
| deleteById(1) |
+---------------+
| 24            |
+---------------+
MariaDB [hellodb]> select * from students where STUID=1;
Empty set (0.00 sec)
#自定义函数中定义局部变量语法
#DECLARE var1[,var2,...] VAR_TYPE [DEFAULT 默认值]
#局部变量的作用范围是再BEGIN...END程序中,而且定义局部变量语句必须在BEGIN...END的第衣阿华那个定义
MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> create function addtwonumber(x smallint unsigned,y smallint unsigned)
    -> returns smallint
    -> begin
    -> declare a,b smallint;
    -> set a=x,b=y;
    -> return a+b;
    -> end//
Query OK, 0 rows affected (0.00 sec)
#创建一个多变量函数,实现简单的加法运算
MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> show function status\G;
*************************** 1. row ***************************
                  Db: hellodb
                Name: addtwonumber
                Type: FUNCTION
             Definer: root@localhost
            Modified: 2019-06-16 15:28:37
             Created: 2019-06-16 15:28:37
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
MariaDB [hellodb]> select addtwonumber(1,2);
+-------------------+
| addtwonumber(1,2) |
+-------------------+
|                 3 |
+-------------------+
  • 存储过程
    • 把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调用,省去了编译的过程
    • 可提高运行速度,降低网络传输数据量
  • 存储过程与自定义函数的区别
    • 存储过程实现的过程要复杂一些,而函数的针对性骄傲强
    • 存储过程可以有多个返回值,而自定义函数只有一个返回值
    • 存储过程一般独立执行,而函数往往时作为其他SQL语句的一部分来使用
  • 创建存储过程
    • CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter …]]) routime_body
    • proc_parameter : [IN|OUT|INOUT] parameter_name type
      • 其中IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型
MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> create procedure showtime()
    -> begin 
    -> select now();
    -> end //
Query OK, 0 rows affected (0.00 sec)
#创建存储过程,显示当前时间
MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> call showtime;
+---------------------+
| now()               |
+---------------------+
| 2019-06-16 15:46:13 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> create procedure selectbyid(in uid smallint unsigned)
    -> begin
    -> select * from students where stuid=uid;
    -> end //
Query OK, 0 rows affected (0.00 sec)
#创建带参数存储过程,实现传参数并查找对应记录
MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> call selectbyid(2);
+-------+------------+-----+--------+---------+-----------+
| StuID | Name       | Age | Gender | ClassID | TeacherID |
+-------+------------+-----+--------+---------+-----------+
|     2 | Shi Potian |  22 | M      |       1 |         7 |
+-------+------------+-----+--------+---------+-----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> create procedure deletebyid( in uid smallint unsigned,out num smallint unsigned)
    -> begin
    -> delete from students where stuid >= uid;
    -> select row_count() into num;
    -> end //
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> call deletebyid(20,@line);
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> select @line;
+-------+
| @line |
+-------+
|     6 |
+-------+
1 row in set (0.00 sec)
  • 触发器
    • 触发器的执行不是由程序调用,也不是由手工启动,而是由时间来触发、激活从而实现执行
    • CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body`
      • trigger_name:触发器的名称
      • trigger_time:{BEFORE|AFTER},表示在事件之前或之后出发
      • trigger_event:{INSERT|UPDATE|DELETE},出发的具体时间
      • tbl_name:该触发器作用在表名
MariaDB [hellodb]> create table student_info (
    -> stu_id int(11) not null auto_increment,
    -> stu_name varchar(255) default null,
    -> primary key(stu_id)
    -> );
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> create table student_count (
    -> student_count int(11) default 0
    -> );
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> insert into student_count values(0);
Query OK, 1 row affected (0.00 sec)
MariaDB [hellodb]> create trigger trigger_student_count_insert after insert on student_info for each row update student_count set student_count=student_count+1;
Query OK, 0 rows affected (0.00 sec)
#创建触发器,在insert指令后执行,更新student_count中的计数器
MariaDB [hellodb]> create trigger trigger_student_count_delete after delete on student_info for each row update student_count set student_count=student_count-1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> show triggers\G;
*************************** 1. row ***************************
             Trigger: trigger_student_count_insert
               Event: INSERT
               Table: student_info
           Statement: update student_count set student_count=student_count+1
              Timing: AFTER
             Created: NULL
            sql_mode: 
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
             Trigger: trigger_student_count_delete
               Event: DELETE
               Table: student_info
           Statement: update student_count set student_count=student_count-1
              Timing: AFTER
             Created: NULL
            sql_mode: 
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.00 sec)
MariaDB [hellodb]> USE information_schema;
Database changed
MariaDB [information_schema]> SELECT * FROM triggers WHERE trigger_name='trigger_student_count_insert'\G;
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: hellodb
              TRIGGER_NAME: trigger_student_count_insert
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: hellodb
        EVENT_OBJECT_TABLE: student_info
              ACTION_ORDER: 0
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: update student_count set student_count=student_count+1
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: AFTER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: NULL
                  SQL_MODE: 
                   DEFINER: root@localhost
      CHARACTER_SET_CLIENT: utf8
      COLLATION_CONNECTION: utf8_general_ci
        DATABASE_COLLATION: utf8_general_ci
1 row in set (0.00 sec)
MariaDB [hellodb]> select * from student_count;
+---------------+
| student_count |
+---------------+
|             0 |
+---------------+
1 row in set (0.00 sec)

MariaDB [hellodb]> desc student_info;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| stu_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| stu_name | varchar(255) | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+
MariaDB [hellodb]> insert into student_info (stu_id,stu_name) values (1,'zhao'); 
Query OK, 1 row affected (0.00 sec)
MariaDB [hellodb]> select * from student_info;
+--------+----------+
| stu_id | stu_name |
+--------+----------+
|      1 | zhao     |
+--------+----------+
1 row in set (0.00 sec)

MariaDB [hellodb]> select * from student_count;
+---------------+
| student_count |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)
MariaDB [hellodb]> insert into student_info (stu_id,stu_name) values (2,'qian'); 
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> select * from student_count;                                 +---------------+
| student_count |
+---------------+
|             2 |
+---------------+
1 row in set (0.00 sec)

MariaDB [hellodb]> delete from student_info where stu_id=1;
Query OK, 1 row affected (0.00 sec)

MariaDB [hellodb]> select * from student_info;                                  +--------+----------+
| stu_id | stu_name |
+--------+----------+
|      2 | qian     |
+--------+----------+
1 row in set (0.00 sec)

MariaDB [hellodb]> select * from student_count;            
+---------------+
| student_count |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

2、描述MySQL中有哪些存储引擎并描述各自的区别

在这里插入图片描述

  • 常用的存储引擎:
    • MyISAM:
      • 特点:
        • 不支持事务
        • 表级锁
        • 读写相互阻塞,读时不能写,写时不能读
        • 只缓存索引
        • 不支持外键约束
        • 不支持聚簇索引
        • 读取数据快,占用资源少
        • 不支持MVCC(多版本并发控制机制)高并发
        • 崩溃恢复性较差
      • 适用场景:
        • 只读或者写操作较少、表较小的场景
      • 引擎文件:
        • tbl_name.frm:表格式定义
        • tbl_name.MYD:数据文件
        • tbl_name.MYI:索引文件
    • InnoDB:
      • 特点:
        • 支持事务,适合处理大量短期事务
        • 行级锁
        • 读写阻塞与事务隔离级别相关
        • 可缓存数据和索引
        • 支持聚簇索引
        • 崩溃恢复性好
        • 支持MVCC高并发
        • MySQL5.5后支持全文索引
      • 所有InnoDB表的数据和索引放置与同一个表空间中
        • 表空间文件:datadir定义的目录下
        • 数据文件:idbdata1,idbdata2,…
      • 每个表单独使用一个表空间存储表的数据和索引
        • innodb_file_per_table=ON
      • 两类文件放在数据库独立目录中
        • 数据文件(存储数据和索引):tb_name.ibd
        • 表格式定义:tb_name.frm
    • Performance_Schema:Performance_Schema数据库使用
    • Memory :将所有数据存储在RAM中,以便在需要快速查找参考和其他类似数据的环境中进行快速访问。适用存放临时数据。引擎以前被称为HEAP引擎
    • MRG_MyISAM:使MySQL DBA或开发人员能够对一系列相同的MyISAM表进行逻辑分组,并将它们作为一个对象引用。适用于VLDB(Very Large Data Base)环境,如数据仓库
    • Archive :为存储和检索大量很少参考的存档或安全审核信息,只支持SELECT和INSERT操作;支持行级锁和专用缓存区
    • Federated联合:用于访问其它远程MySQL服务器一个代理,它通过创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,而后完成数据存取,提供链接单独MySQL服务器的能力,以便从多个物理服务器创建一个逻辑数据库。非常适合分布式或数据集市环境
    • BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性
    • Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性
    • CSV:CSV存储引擎使用逗号分隔值格式将数据存储在文本文件中。可以使用CSV引擎以CSV格式导入和导出其他软件和应用程序之间的数据交换
    • BLACKHOLE :黑洞存储引擎接受但不存储数据,检索总是返回一个空集。该功能可用于分布式数据库设计,数据自动复制,但不是本地存储
    • example:“stub”引擎,它什么都不做。可以使用此引擎创建表,但不能将数据存储在其中或从中检索。目的是作为例子来说明如何开始编写新的存储引擎

3、描述索引的工作原理并创建各种索引

  • 索引:适用于数据量大,读取多写入少的场景
    • 特殊的数据结构,定义在查找时作为查找条件的字段,在MySQL中又称为键key,索引通过存储引擎实现
    • 优点:
      • 索引可以降低服务需要扫描的数据量,减少了IO次数
      • 索引可以帮助服务器避免排序和使用临时表
      • 索引可以帮助将随机IO转为顺序IO
    • 缺点:
      • 占用额外空间,影响插入速度
  • B+ Tree
    • 每个根节点与分支节点只存放索引,所有的原始数据都存放在叶子节点,且存在数据指针(链表),可大大提高范围搜索的效率,所有记录的查询效率是一样的。
  • 红黑树
    • 红黑树是平衡的二叉树:每个分支下都有两个节点
  • B- Tree
    • 平衡树,多叉树,每个节点直接存放数据,最差的结果查询次数一样
  • 可以使用B+Tree索引的查询类型
    • 全值匹配:精确所有索引列
    • 匹配最左前缀:即只是用索引的第一列
    • 匹配范围值;
    • 精确匹配某一列并范围匹配另一列
  • B+Tree索引的限制:
    • 如不从最左列开始,则无法使用索引
    • 不能跳过索引中的列
    • 如果查询中某个列是为查询范围,那么其右侧的列都无法再使用索引
  • 聚簇索引和非聚簇索引:
    • 根据磁盘上保存索引的方式来划分
    • 索引与数据是否放在一起
  • 主键索引和二级索引
    • 主键索引:
      • 索引和数据都放在叶子节点上
    • 二级索引:
      • 索引和主键放在一起,先确定主键,再通过主键索引确定数据位置
  • 稠密索引、稀疏索引:
    • 是否索引了每一个数据项
  • 简单索引:
    • 对一个字段建立的索引
  • 组合索引:
    • 针对多个字段建立索引

  • 索引优化策略:
    • 独立地使用列:尽量避免其参与运算,独立的列索引指索引列不能是表达式的一部分,也不能是函数的参数,再where条件中,始终将索引列单独放在比较符号的一侧
    • 左前缀索引:构建指定索引字段的左侧的字符数,要通过索引选择性来评估
    • 索引选择性:不重复的索引值和数据表的记录占总数的比值
    • 多索引列:AND操作时更适合使用多列索引,而非为每个列创建单独的索引
    • 先择合适的索引列顺序:无排序和分组时,将选择性最高放左侧
  • 索引优化建议:
    • 只要列中含有NULL值,就最好不要在此列设置索引,符合索引如果有NULL值,此列在使用时也不会使用索引
    • 尽量使用短索引,如果可以,应该指定一个前缀长度
    • 对于经常在where子句使用的列,最好设置索引
    • 对于有多个列where或order by的子句,应该建立复合索引
    • 对于like语句,以%或者-开头的不会使用索引,以%结尾会使用索引
    • 尽量不要在列上进行运算(函数操作和表达式操作)
    • 尽量不要使用not in和<>操作,会导致全文索引
  • sql语句性能优化
    • 查询时,能不用就不用,尽量写全字段名
    • 大部分情况下连接效率远大于子查询,inner join
    • 多表连接时,尽量小表驱动大表,即小表join大表
    • 在有大量记录的表分页时使用limit
    • 对于经常使用的查询,可以开启缓存
    • 多使用explain和profile分析查询语句
    • 查看慢查询日志,找出执行时间长的sql语句进行优化
MariaDB [hellodb]>SET GLOBAL userstat=1;       #开启索引统计功能
MariaDB [hellodb]> desc testlog;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(10) | YES  |     | NULL    |                |
| age   | int(11)  | YES  |     | 20      |                |
+-------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
MariaDB [hellodb]> create index index_name on testlog(name(10));
Query OK, 0 rows affected (0.29 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [hellodb]> create index index_name_age on testlog(name,age);
Query OK, 0 rows affected (0.26 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [hellodb]> show indexes from testlog\G
*************************** 1. row ***************************
        Table: testlog
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 100334
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: testlog
   Non_unique: 1
     Key_name: index_name
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 100334
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: testlog
   Non_unique: 1
     Key_name: index_name_age
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 200
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 4. row ***************************
        Table: testlog
   Non_unique: 1
     Key_name: index_name_age
 Seq_in_index: 2
  Column_name: age
    Collation: A
  Cardinality: 200
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
4 rows in set (0.00 sec)
MariaDB [hellodb]> select * from testlog where age='100';           
+-----+---------+------+
| id  | name    | age  |
+-----+---------+------+
| 100 | wang100 |  100 |
+-----+---------+------+
1 row in set (0.01 sec)
MariaDB [hellodb]> select * from testlog where name='wang2';
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  2 | wang2 |    2 |
+----+-------+------+
1 row in set (0.00 sec)
MariaDB [hellodb]> select * from testlog where id = '1000';
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
| 1000 | wang1000 | 1000 |
+------+----------+------+
1 row in set (0.00 sec)

MariaDB [hellodb]> show index_statistics;            #统计索引使用情况          
+--------------+------------+----------------+-----------+
| Table_schema | Table_name | Index_name     | Rows_read |
+--------------+------------+----------------+-----------+
| hellodb      | testlog    | PRIMARY        |         1 |
| hellodb      | testlog    | index_name     |        10 |
| hellodb      | testlog    | index_name_age |    201113 |
+--------------+------------+----------------+-----------+

4、总结binlog备份方法,用脚本实现每小时备份binlog

  • binlog:又称为归档日志
    • 记录导致数据变化或潜在导致数据改变的SQL语句,可用于数据恢复
    • 记录已提交的日志
    • 不依赖于存储引擎类型
    • 通过“重放”日志文件中的时间来生成数据副本
  • 三种记录格式
    1. 基于语句型,默认模式statement,用于记录命令本身
    2. 基于行记录:row,用于记录数据,日志量较大
    3. 混合模式:mixed,让系统自行判定基于哪种方式进行
MariaDB [hellodb]> show variables like 'binlog_format';             #查看二进制日志格式
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
  • 二进制日志文件的构成
    • 日志文件:
      • mysql|mariadb-bin.00001,二进制格式
      • 索引文件:mysql|mariadb-bin.index
  • mysqldump常见选项:
    • -A, --all-databases 备份所有数据库,含create database
    • -B , --databases db_name… 指定备份的数据库,包括create database语句
    • -E, --events:备份相关的所有event scheduler
    • -R, --routines:备份所有存储过程和自定义函数
    • –triggers:备份表相关触发器,默认启用,用–skip-triggers,不备份触发器
    • –default-character-set=utf8 指定字符集
    • –master-data[=#]: 此选项须启用二进制日志
      • 1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1
      • 2:记录为注释的CHANGE MASTER TO语句
      • 此选项会自动关闭–lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启–single-transaction)
    • -F, --flush-logs :备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新,可通过和–single-transaction或-x,–master-data 一起使用实现,此时只刷新一次日志
    • –compact 去掉注释,适合调试,生产不使用
    • -d, --no-data 只备份表结构
    • -t, --no-create-info 只备份数据,不备份create table
    • -n,–no-create-db 不备份create database,可被-A或-B覆盖
    • –flush-privileges 备份mysql或相关时需要使用
    • -f, --force 忽略SQL错误,继续执行
    • –hex-blob 使用十六进制符号转储二进制列,当有包括BINARY, VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码
    • -q, --quick 不缓存查询,直接输出,加快备份速度
[root@localhost data]# vim mysqlbak.sh 
#!/bin/bash
logdir=/data/binlog
user=root
userpasswd=''
backdir=/data/backup/
/usr/bin/mysqladmin -u$user -p$userpasswd flush-logs            #刷新二进制日志位置
mysqldump -A --single-transaction -F --master-data=2 | gzip > $backdir/all_back_`date +%F-%T`.sql.gz                    #进行全备份
[root@localhost ~]# crontab -e
0 * * * * /bin/bash /data/mysqlbak.sh
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值