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在客户端和服务端已经安装好了
- 卸载 centos 中预安装的mysql
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树索引 , 统称为索引.
索引分类:
- 单值索引
- 一个索引包含一个列,一个表可以有多个单列索引
- 唯一索引
- 索引值必须唯一,但是允许有空值
- 复合索引
- 一个索引包含多个列
创建索引:
- CREATE 索引类型[唯一|全文] INDEX 索引名称 [默认b+Tree索引] on 表名 (字段,字段..)
- create index index_name on table(name) -- 这个就是普通索引
- CREATE INDEX id_name on tb_table (name,email,status)
- 创建复合索引
查看索引:
- show index from 表名;
删除索引:
- drop index 索引名称 on 表名;
修改表建索引:
- alter table tb_name add primary key(column_list).
- 添加一个主键索引 , 索引值必须唯一,不能为NULL
- alter table tb_name add unique index_name(column_list)
- 唯一索引, 索引值必须唯一,,但可以出现多个null
- alter table tb_name add index index_name(column_list)
- 普通索引 , 索引值可以重复
- alter table tb_name add fulltext index_name(column_list)
- 全文索引
索引设计原则:
- 查询多,数据量大的表建立索引
- 索引字段列最好从where子句中提取
- 使用唯一索引,区分度高 效率就高
- 使用短索引 , 索引字段总长度段就能存储更多的索引值
- 利用最左前缀,N个列组合的索引,相当创建了N个索引, 如果查询where子句中使用了组成该索引的前几个字段,那么查询语句就可以利用组合索引提升效率
- 索引也是在磁盘中存储
sql优化:
-
查看SQL的执行频率
- show status like 'com_____' 7个占位符 , 查看当前连接信息
- show global status like 'com_____' 7个占位符 , 查看全局(全部)信息
-
定位低效的执行SQL
- 慢日志,但是慢查询日志在查询结束后才有记录
- show processlist: 进行实时查看 ,
-
explain分析执行计划
- 查询结果首行id数字表示 数字越大优先级越高就是先查询那个表
- 如果数字相同 那就是正常从上往下执行
-
索引提升效率
- 避免索引失效
- 违反最左前缀法则,索引失效
- 如果索引了多个列,就要遵守最左前缀法则
- 指从索引最左前列开始,并且不跳过索引中的列
- 在复合索引中,使用范围查询 , 右边的列不能使用索引
- 也就是在范围条件后的条件中 索引不会生效
- 不要在索引列进行运算,否则索引失效
- 字符串不加单引号,索引失效
- 原因就是底层对未加单引号的值进行隐士类型转换,也就是底层进行了运算操作
- 尽量使用覆盖索引,避免使用 select *
- 因为就算是使用了索引查询,但如果是* 就需要回表查询,因为索引列不包含整行的全部数据
- or条件
- 用or分割条件 ,or前的条件有索引,or后条件没有索引,那么涉及的索引都不会被用到
- 可以使用union替换or union就是一个求并集的操作
- 以%开头的like模糊查询, 索引失效
- 如果是查询的全部为索引列,那么就不会失效 , 就是通过覆盖索引解决这个问题
- mysql评估全表扫描比索引快 , 那就不会走索引
- is NULL is not null 有时索引失效
- 与第9类似,如果条件字段null很少或者没有,is null 就走索引,is not null 就不走
- in走索引 not in索引失效
- 单列和复合
- 尽量使用复合索引,少使用单列索引
- 查看索引使用情况
- show global status like 'Handler_read%'
- 大批量插入数据
- 使用load命令导入,提高效率
- load data local infile '文件路径' into '要导入的表名' fields terminated by ',' lines terminated by '\n'
- load data 加载数据
- into '要导入的表名' 加载到哪里
- fields terminated by 每个之间用什么分割
- lines terminated by '\n' 每行之间用什么分割
- 使用load命令导入,提高效率
- inster优化
- 尽量使用一条插入语句完成
- 插入数据顺序尽量有序
- 以主键顺序插入,,因为Innodb是按照主键顺序保存的
- order by 优化
- 通过有序索引顺序扫描直接返回有序数据,不需要额外排序,效率高
- 查询结果返回的是索引值
- 多字段排序,要么全部升序要么全部降序, 否则效率变低
- 注 排序的顺序要和索引的顺序保持一致
- 通过有序索引顺序扫描直接返回有序数据,不需要额外排序,效率高
- group by 优化
- group by其实就是排序后进行了分组操作,可以通过去掉排序 只分组
- 在group by 后加上order by null
- 子查询优化
- 尽量使用多表连查代替子查询
- limit优化
- limit越靠后查询效率越低
- 优化1在索引上完成排序分页操作,根据主键关联回原表查询所需要的其他内容
- 如 select * from t, (select id from tb order by id limit 20000,10;) a where t.id = a.id
- 优化2 把limit查询转换为某个位置的查询 使用主键自增的表(主键不能有断层)
- select * from tb where id > 20000 limit 10;
- 优化1在索引上完成排序分页操作,根据主键关联回原表查询所需要的其他内容
- limit越靠后查询效率越低
- 使用sql提示
- USE INDEX (给mysql提供参考意见)
- 在查询表名后面,添加USE INDEX 来提供希望mysql参考的索引列表,让mysql不考虑其他索引
- select * from 表名 USER INDEX (希望使用的索引名)
- IGNORE INDEX
- 表示要忽略那个索引
- select * from 表名 USER INDEX (希望忽略的索引名)
- 表示要忽略那个索引
- FORCE INDEX
- 强制使用特定的索引
- select * from 表名 USER INDEX (必须要走的索引名)
- 强制使用特定的索引
- 在查询表名后面,添加USE INDEX 来提供希望mysql参考的索引列表,让mysql不考虑其他索引
- USE INDEX (给mysql提供参考意见)