MySql索引

MySql安装Linux:

注:安装中需要查看日志,以便获取初始密码!  !  !

  • windows的安装大家都会 就不多说了
    • 初始密码就在root/.mysql_secret
    • 使用 cat /root/.mysql_secret 查看(local time):就是密码
      • 下面输出................(local time): h_7bq......
  • Linux系统安装
    • 卸载 centos 中预安装的mysql
      • rpm -pa | grep -i mysql (查看当前系统的mysql版本)
      • rpm -e mysq1-libs-5.1.71-1.e16.x86_64 --nodeps(卸载mysql)
    • 上传 mysql 的安装包
      • alt+p---> put E:/test/MySQL-5.6.22-1.e16.i686.rpm-bundle.tar(上传压缩包)
    • 解压 mysql 的安装包
      • mkdir mysql(创建mysql的安装的目录)
      • tar -xvf MysQL-5.6.22-1.e16.i686.rpm-bundle.tar -c /root/mysql(压解压至此文件夹)
    • )安装依赖包
      • yum -y install libaio.so.1 libgcc_s.so.1 libstdc++.so.6 libncurses.so.5 --setopt=protected_multilib=false
      • yum update libstdc++-4.4.7-4.e16.x86 64
    • 安装 mysql-client
      • rpm -ivh MysQL-client-5.6.22-1.e16.i686.rpm
    • 安装mysql-server
      • rpm -i vh MySql-server-5.622-1.el6.i686.rpm
    • 至此MySql在Linux在客户端和服务端已经安装好了

Linux上启动Mysql:

  • service mysql status (查看状态 如果显示ERROR! mysql is not running 表示未启动)
  • 启动mysql
    • service mysql start
  • 停止mysql
    • service mysql stop 

Linux上登录Mysql:

  • 与windows一样
    • mysql -u root -p(按下回车输入密码)
  • 初始密码
    • 查看最上方的注 哪里有获取
  • 修改初始密码
    • 在登录进去后 直接  set password = password('俺滴新密码');
  • 连接
    • 我们在使用时 肯定不止局限与命令行连接 还有三方软件
    • 在我们输入Linux的IP mysql密码 端口等信息 依然连接不上,是因为Linux上的msql并没有授权远程访问,windows连接linux需要授权, 授权后刷新
    • 远程授权
      • grant all privileges on *.* to 'root' @'%' identified by '数据库密码'; 
    • 刷新授权
      • flush privileges;
  • 还不行的话 就看linux防火墙
    • service iptables status
  • 关闭
    • service iptables stop

Mysql索引:

索引概述:

  • 是帮助MySql高效查询获取数据的数据结构(有序) , 他们以某种方式引用(指向)数据,这样可以在数据结构上实现高级查找算法,这种数据结构就是索引
  • 举个例子哈
    • 我们去酒店找人只知道在5楼,但是5楼有10个房间分别是 3 6 4 2 5 8 9 1 7,你只知道在6房间号,那是不是需要一个一个看房间号,这样就涉及到我们在查询数据时,会产生整表扫描,一个一个去比对
    • 如果有索引,因为索引就是数据结构,索引我们给房间号建立索引
房间号为:  3 6 4 2 5 8 9 1 7 存在数据库中 

建立索引为二叉树

第一个元素作为根节点 3 
那么小于3的会放在3的左下边, 大于3 的会放在3的右下边 , 以此类推
得到:
              3
         2         6
       1        4      8
                  5  7   9

我们可以理解 ,他将这些排好以后,每个节点都会指向数据,然后我们在查询时只需要找到该节点就能获取其中对应的值, 大概就是这个意思,
另外 二叉树只能有两个节点, 所以每个根下只有两个节点,如果出现第三个那就放在两个子节点中对应的节点下,作为子节点

二叉树不做解释 大概明白索引是什么就行

如下图中的排列内容

索引的优势劣势:

  • 优势:
    • 类似书籍目录,提高检索效率,降低数据的IO成本
    • 通过索引列队数据进行排序, 降低数据排序的成本,降低CPU的消耗
  • 劣势:
    • 实际上索引也是一个表,保存了主键与索引字段,并指向实体类的记录, 索引索引列也是占空间的
    • 虽然索引提高了查询效率,降低更新表速度,如对表进行 INSERT  UPDATE DELETE ,因为MySql更新时,不仅要保存数据,还要更新一下索引文件每次更新添加了索引列的字段,键值变化就要更新,相当于更新了两份内容
    • 所以索引并不是越多越好, 要根据实际业务场景进行添加索引的操作

索引结构:

  • 索引是在mysql的存储引擎中实现的,而不是在服务器层实现的,所以每种存储引擎都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的,MySql目前提供了以下4种索引:
  • BTREE索引:最常见的索引类型,大部分都支持B树索引
  • HASH索引: 只有Memory引擎类型,使用场景简单
  • R-tree索引(空间索引):空间索引是MyISAM引擎的一个特殊类型,用与地理空间类型,使用少,
  • Full-text(全文索引):是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从Mysql5.6版本开始支持全文索引

注:我们平常所说的索引,如果没特别指明,都是指B+树(多路搜索树,并不一定是二叉树的) 

注: 结构组织的索引,其中聚集索引 , 复合索引 , 前缀索引 , 唯一索引默认都是使用B+tree树索引 , 统称为索引.

索引分类:

  1. 单值索引
    1. 一个索引包含一个列,一个表可以有多个单列索引
  2. 唯一索引
    1. 索引值必须唯一,但是允许有空值
  3. 复合索引
    1. 一个索引包含多个列

创建索引:

  1. CREATE 索引类型[唯一|全文]  INDEX  索引名称  [默认b+Tree索引]  on 表名 (字段,字段..)
    1. create index index_name on table(name) -- 这个就是普通索引
  2. CREATE INDEX id_name on tb_table (name,email,status)
    1. 创建复合索引

查看索引:

  1. show index from 表名;

删除索引:

  1. drop index  索引名称 on 表名;

修改表建索引:

  1. alter table tb_name add primary key(column_list).
    1. 添加一个主键索引 , 索引值必须唯一,不能为NULL 
  2. alter table tb_name add unique index_name(column_list)
    1. 唯一索引, 索引值必须唯一,,但可以出现多个null
  3. alter table tb_name add index index_name(column_list)
    1. 普通索引 , 索引值可以重复
  4. alter table tb_name add fulltext index_name(column_list)
    1. 全文索引

索引设计原则:

  1. 查询多,数据量大的表建立索引
  2. 索引字段列最好从where子句中提取
  3. 使用唯一索引,区分度高  效率就高
  4. 使用短索引 , 索引字段总长度段就能存储更多的索引值 
  5. 利用最左前缀,N个列组合的索引,相当创建了N个索引, 如果查询where子句中使用了组成该索引的前几个字段,那么查询语句就可以利用组合索引提升效率
  6. 索引也是在磁盘中存储

sql优化:

  1. 查看SQL的执行频率

    1. show status like 'com_____' 7个占位符 , 查看当前连接信息
    2. show global status like 'com_____' 7个占位符 , 查看全局(全部)信息
  2. 定位低效的执行SQL

    1. 慢日志,但是慢查询日志在查询结束后才有记录
    2. show  processlist: 进行实时查看 ,
  3. explain分析执行计划

    1. 查询结果首行id数字表示 数字越大优先级越高就是先查询那个表
    2. 如果数字相同 那就是正常从上往下执行 
  4. 索引提升效率

    1. 避免索引失效
    2. 违反最左前缀法则,索引失效
      1. 如果索引了多个列,就要遵守最左前缀法则
      2. 指从索引最左前列开始,并且不跳过索引中的列
    3. 在复合索引中,使用范围查询 , 右边的列不能使用索引
      1. 也就是在范围条件后的条件中 索引不会生效
    4. 不要在索引列进行运算,否则索引失效
    5. 字符串不加单引号,索引失效
      1. 原因就是底层对未加单引号的值进行隐士类型转换,也就是底层进行了运算操作
    6. 尽量使用覆盖索引,避免使用 select * 
      1. 因为就算是使用了索引查询,但如果是* 就需要回表查询,因为索引列不包含整行的全部数据
    7. or条件
      1. 用or分割条件 ,or前的条件有索引,or后条件没有索引,那么涉及的索引都不会被用到
      2. 可以使用union替换or union就是一个求并集的操作
    8. 以%开头的like模糊查询, 索引失效
      1. 如果是查询的全部为索引列,那么就不会失效 , 就是通过覆盖索引解决这个问题
    9. mysql评估全表扫描比索引快 , 那就不会走索引
    10. is NULL  is not null 有时索引失效
      1. 与第9类似,如果条件字段null很少或者没有,is null 就走索引,is not null 就不走
    11. in走索引 not in索引失效
    12. 单列和复合
      1. 尽量使用复合索引,少使用单列索引
    13. 查看索引使用情况
      1. show global status like 'Handler_read%'
    14. 大批量插入数据
      1. 使用load命令导入,提高效率
        1. load data local infile '文件路径' into '要导入的表名' fields terminated by ',' lines  terminated by '\n'
        2. load data 加载数据
        3. into '要导入的表名'  加载到哪里
        4. fields terminated by 每个之间用什么分割
        5. lines  terminated by '\n'  每行之间用什么分割
    15. inster优化
      1. 尽量使用一条插入语句完成
      2. 插入数据顺序尽量有序
      3. 以主键顺序插入,,因为Innodb是按照主键顺序保存的
    16. order by 优化
      1. 通过有序索引顺序扫描直接返回有序数据,不需要额外排序,效率高
        1. 查询结果返回的是索引值
      2. 多字段排序,要么全部升序要么全部降序, 否则效率变低
        1. 注 排序的顺序要和索引的顺序保持一致
    17. group by 优化
      1. group by其实就是排序后进行了分组操作,可以通过去掉排序 只分组
      2. 在group by 后加上order by null
    18. 子查询优化
      1. 尽量使用多表连查代替子查询
    19. limit优化
      1. limit越靠后查询效率越低
        1. 优化1在索引上完成排序分页操作,根据主键关联回原表查询所需要的其他内容
          1. 如 select * from t, (select id from tb order by id limit 20000,10;) a where t.id = a.id
        2. 优化2 把limit查询转换为某个位置的查询 使用主键自增的表(主键不能有断层)
          1. select * from tb where id > 20000 limit 10;
    20. 使用sql提示
      1. USE INDEX (给mysql提供参考意见)
        1. 在查询表名后面,添加USE INDEX  来提供希望mysql参考的索引列表,让mysql不考虑其他索引
          1. select * from 表名  USER INDEX (希望使用的索引名)
        2. IGNORE INDEX
          1. 表示要忽略那个索引
            1. select * from 表名  USER INDEX (希望忽略的索引名)
        3. FORCE INDEX
          1. 强制使用特定的索引
            1. select * from 表名  USER INDEX (必须要走的索引名)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值