mysql索引

索引是什么?

索引在mysql中也叫做'键'或者'key'(primary key ,unique key , index ket),是储存引擎用于快速找到记录

的一种数据结构,索引对于良好的性能非常的关键,尤其是当表中的数据量越来越大时,索引对于性能的

影响愈发重要,减少io次数,加速查询.(其中primary key 和 unique key,除了有加速查询的效果之外,还有

约束的效果)

        索引优化应该是对查询性能优化最有效的手段了,索引能够轻易将查询性能提高好几个数量级.

  索引就相对于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查询.

索引的原理

索引的目的就是在于提高查询的效率,与我们查阅图书所用的目录是一个道理,先定位到章,然后定位到该章的一个小节,然后找到页数.

  索引所带来的影响:

    1,在表中有大量数据的前提下,创建的索引的速度就会很慢

    2,在索引创建完毕后,对表的查询性能会有大幅度的提升,但是写性能会降低

磁盘的io与预读

属于计算机操作系统对于数据查询的优化:当遇到一次io的时候,不光把当前的磁盘地址的数据读取,

并且把相邻的数据也都读取到内存的缓冲区内.

索引的数据结构

每次查找数据的时把磁盘io次数控制在一个很小的数量级,最好是常数数量级,name我们就想到如果一个高度可控的多路搜索树型能满足需求呢?就这样,b+树应运而生.

如上图就是一个b+树的结构,最上层的树根,中间是树枝,最下面是叶子节点.它们的真实数据都是

存储在叶子节点,在最上层进行查找一层层的往下执行.经过3次io就可以在叶子节点找到数据.

搜索的字段尽量的小:我们io的次数是根据b+数高度来决定的,如果你突然想插入一个数据而低层叶子节点已经到了最大的储存的限定,就只能在开辟一个树枝去存储数据和字段之间的关系了,所以

字段尽可能的小,我们就可以存储跟多的数据,也不会改变树形的高度.

联合索引:当索引的值是两个的时候,可以理解为mysql的联合key,只有查找联合key的规律才能加快搜索的效率

索引的最左匹配特性:在遇到联合索引或者单索引存储关系包含区间的时候,他会实行最左的匹配特性.简单说就是数据库的左边开始匹配,再匹配到数据的右边.

mysql的索引管理

普通索引INDEX:加速查找

唯一索引:
    -主键索引PRIMARY KEY:加速查找+约束(不为空、不能重复)
    -唯一索引UNIQUE:加速查找+约束(不能重复)

联合索引:
    -PRIMARY KEY(id,name):联合主键索引
    -UNIQUE(id,name):联合唯一索引
    -INDEX(id,name):联合普通索引

创建/删除索引的语法

#方法一:创建表时
      CREATE TABLE 表名 (
                字段名1  数据类型 [完整性约束条件…],
                字段名2  数据类型 [完整性约束条件…],
                [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                );


#方法二:CREATE在已存在的表上创建索引
        CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                     ON 表名 (字段名[(长度)]  [ASC |DESC]) ;


#方法三:ALTER TABLE在已存在的表上创建索引
        ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                             索引名 (字段名[(长度)]  [ASC |DESC]) ;
                             
#删除索引:DROP INDEX 索引名 ON 表名字;
View Code

查询优化神器-explain

执行计划:让mysql预估执行操作(一般正确)
    all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
    id,email
    
    慢:
        select * from userinfo3 where name='alex'
        
        explain select * from userinfo3 where name='alex'
        type: ALL(全表扫描)
            select * from userinfo3 limit 1;
    快:
        select * from userinfo3 where email='alex'
        type: const(走索引)

慢查询优化的基本步骤

0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析

慢日志管理

慢日志
            - 执行时间 > 10
            - 未命中索引
            - 日志文件路径
            
        配置:
            - 内存
                show variables like '%query%';
                show variables like '%queries%';
                set global 变量名 =- 配置文件
                mysqld --defaults-file='E:wupeiqimysql-5.7.16-winx64mysql-5.7.16-winx64my-default.ini'
                
                my.conf内容:
                    slow_query_log = ON
                    slow_query_log_file = D:/....
                    
                注意:修改配置文件之后,需要重启服务
MySQL日志管理
========================================================
错误日志: 记录 MySQL 服务器启动、关闭及运行错误等信息
二进制日志: 又称binlog日志,以二进制文件的方式记录数据库中除 SELECT 以外的操作
查询日志: 记录查询的信息
慢查询日志: 记录执行时间超过指定时间的操作
中继日志: 备库将主库的二进制日志复制到自己的中继日志中,从而在本地进行重放
通用日志: 审计哪个账号、在哪个时段、做了哪些事件
事务日志或称redo日志: 记录Innodb事务相关的如事务执行时间、检查点等
========================================================
一、bin-log
1. 启用
# vim /etc/my.cnf
[mysqld]
log-bin[=dir[filename]]
# service mysqld restart
2. 暂停
//仅当前会话
SET SQL_LOG_BIN=0;
SET SQL_LOG_BIN=1;
3. 查看
查看全部:
# mysqlbinlog mysql.000002
按时间:
# mysqlbinlog mysql.000002 --start-datetime="2012-12-05 10:02:56"
# mysqlbinlog mysql.000002 --stop-datetime="2012-12-05 11:02:54"
# mysqlbinlog mysql.000002 --start-datetime="2012-12-05 10:02:56" --stop-datetime="2012-12-05 11:02:54" 

按字节数:
# mysqlbinlog mysql.000002 --start-position=260
# mysqlbinlog mysql.000002 --stop-position=260
# mysqlbinlog mysql.000002 --start-position=260 --stop-position=930
4. 截断bin-log(产生新的bin-log文件)
a. 重启mysql服务器
b. # mysql -uroot -p123 -e 'flush logs'
5. 删除bin-log文件
# mysql -uroot -p123 -e 'reset master' 


二、查询日志
启用通用查询日志
# vim /etc/my.cnf
[mysqld]
log[=dir[filename]]
# service mysqld restart

三、慢查询日志
启用慢查询日志
# vim /etc/my.cnf
[mysqld]
log-slow-queries[=dir[filename]]
long_query_time=n
# service mysqld restart
MySQL 5.6:
slow-query-log=1
slow-query-log-file=slow.log
long_query_time=3
查看慢查询日志
测试:BENCHMARK(count,expr)
SELECT BENCHMARK(50000000,2*3);
原文地址:https://www.cnblogs.com/lowen107/p/10109253.html