Python Day 42 Mysql基础语法(四)、存储引擎、索引、慢日志查询、普通日志记录(general log)、权限管理、explain工具

  ##存储引擎

#1、什么是存储引擎
mysql中建立的库===>文件夹
库中建立的表===>文件
现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制:比如处理文本用txt类型,处理表格用excel,处理图片用png等。
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎
#2、如何查看存储引擎 2-1、show enginesG #查看所有支持的存储引擎 2-2、 show variables like 'storage_engine%'; #查看正在使用的存储引擎 #3、如何使用存储引擎
#3-1、方式一:建表时指定 create table t1( id int auto_increment primary key, name varchar(32) not null default '' )engine=Innodb charset=utf8;
#3-2、方式二:在配置文件中指定默认的存储引擎 /etc/my.cnf [mysqld] default-storage-engine=INNODB innodb_file_per_table=1 #4、存储引擎分类: (****************) Innodb (重点) 1.(默认版本包含5.5) 2.支持事务 3.不支持全文索引 4.索引和数据都是在同一个文件中, .ibd 表的结构实在.frm文件中 MyIsam(重点) 1.(默认版本5.5以下 5.3) 2.不支持事务 3.支持全文索引 4..frm: 表结构 .MYD: 表数据 .MYI: 表索引 memory:存储引擎中的数据都存放在内存中 全文索引: sphinx

   ##索引

#1、什么是索引
索相当于新华字典的目录, 可以将索引理解成一个特殊的文件, 然后如果没有这个文件的话, 查询是从前到后查找数据的,如果有这个文件的话, 会按照一种特殊的数据结构(二叉树)查找数据。

#2、为什么要使用索引
对于一个应用来说,对数据库的读写比例基本上是10:1,即读多写少,而且对于写来说极少出现性能问题,大多数性能问题都是慢查询,提到加速查,就必须用到索引。

#3、MySQL中索引的优点和缺点和使用原则

   #3-1、优点:     1、所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引      2、、大大加快数据的查询速度
  
#3-2、缺点:      1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加      2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值      3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。
   
#3-3、使用原则:      通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。      1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,      2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。      3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。       #注意:一个表中很够创建多个索引,这些索引度会被存放到一个索引文件中(专门存放索引的地方) #4、索引分类 #4-1、主键索引: 第一种: create table t1( id int auto_increment primary key, name varchar(32) not null default '' )engine=Innodb charset=utf8; 第二种: alter table t1 change id id int auto_increment primary key; #4-2、唯一索引: 第一种: create table t1( id int auto_increment primary key, name varchar(32) not null default '', unique ix_name (name) )engine=Innodb charset=utf8; 第二种: create unique index 索引名称(ix_name) on 表名(t1)(name); create unique index 索引名称(ix_name_age) on 表名(t1)(name,age); #4-3、普通索引: 第一种: create table t1( id int auto_increment primary key, name varchar(32) not null default '', index ix_name (name) )engine=Innodb charset=utf8; 第二种: create index 索引名称(ix_name) on 表名(t1)(name); #5、创建组合索引 组合索引就是在多个字段上创建一个索引、创建一个表t3,在表中的id、name和age字段上建立组合索引,组合索引就是遵从了最左前缀,利用索引中最左边的列集来匹配行,这样的列集称为最左前缀,不明白没关系,举几个例子就明白了,例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如age或者(name,age)组合就不会使用索引查询。 - 组合索引最左前缀 如果组合索引为:(name,email) where name and email -- 使用索引 where name -- 使用索引 where email -- 不使用索引 #6、索引删除: drop index 索引名称(ix_name) on 表名(t1); #7、场景: 使用频繁的列上加一个索引 #8、索引的使用: explain 工具(本章末尾详细介绍) 查看sql语句是否用的上索引, 或者查看sql执行效率的工具 给执行的SQL语句出一个报告, 通过此报告来判断sql语句的执行效率和效果 ES (elasticsearch ) SQL语句的规则: - 不建议使用 like 进行搜索

   ##慢日志查询(slow log)

日志文件: 记录了执行速度特别慢的SQL语句

开启的步骤:
    1. show variables like '%query%';
    2.  slow_query_log = ON
    3. set global long_query_time = 1; 设置慢查询的时间4.  slow_query_log_file  = E:programmysql-5.6.44-winx64dataoldboy-slow.log 
ps:
  1、面试时,你怎么排查一下你网站变慢的原因?
    开启慢查询,将执行时间过长的SQL记录在文件中
  2、线上开启慢查询日志,DBA去操作的,其他人没权限也不能干

  ##普通日志记录(general  log)

#使用场景
SQL审计 (记录sql的操作语句),设定以后用户操作的每一条命令都会被记录,但不会记录显示的结果,这一点和tee命令有点区别,tee 文件路径  (会记录结果)


show variables like '%general%';
+------------------+------------------------------------------------+
| Variable_name    | Value                                          |
+------------------+------------------------------------------------+
| general_log      | ON                                             |
| general_log_file | E:programmysql-5.6.44-winx64dataoldboy.log |
+------------------+------------------------------------------------+
set global general_log = ON;

  ##权限管理

#1、创建用户
    create user '用户名'@'IP地址' identified by '密码';
    creaee user 'zekai'@'192.168.1.123' identified by '123qwe';
    creaee user 'zekai'@'192.168.1.%' identified by '123qwe';
    create user 'zekai'@'%' identified by '123qwe';
    
#2、删除用户
    drop user '用户名'@'IP地址';
#3、修改用户
    rename user '用户名'@'IP地址' to '新用户名'@'IP地址';
    
#4、修改密码
    set password for '用户名'@'IP地址' = Password('新密码')

#5、授权:
    grant  权限 on 数据库.表 to   '用户'@'IP地址'      -- 授权
    
    grant select on db1.*  to 'zekai'@'%';
    grant select on *.*  to 'zekai'@'%';
    grant select, insert, delete on db1.*  to 'zekai'@'%';

#6、重新加载权限表,更新权限:
    flush privileges;

   ##explain 工具介绍

#1、explain介绍
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
使用方法,在select语句前加上explain就可以了:
如:
mysql> explain select * from blok where url='owen'G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: blok
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
        Extra: Using where
1 row in set (0.00 sec)

#2、EXPLAIN列的解释:

table:显示这一行的数据是关于哪张表的

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、
eq_reg、ref、range、index和ALL
         type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
         一般来说,得保证查询至少达到range级别,最好能达到ref。

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:MYSQL认为必须检查的用来返回请求数据的行数

Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

#3、extra列返回的描述的意义
该列包含MySQL解决查询的详细信息

Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。

Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。

range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。

Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。

Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。

Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。

Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。

Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。

Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
原文地址:https://www.cnblogs.com/liangzhenghong/p/11039684.html