一.Mysql的存储引擎
MyISAM的特点:
不支持完整的事务,奔溃恢复能力差
.frm:表结构信息
.MYD:数据文件
.MYI:表的索引信息(比innodb多的文件)
InnoDB 特点:
1)、支持事务
2)、数据多版本读取(InnoDB+MyISAM+ISAM)
3)、锁定机制的改进
4)、实现外键
2. innodb 与 myisam 区别
- InnoDB 支持事务,MyISAM 不支持,对于 InnoDB 每一条 SQL 语言都默认封装成事务, 自动提交,这样会影响速度,所以最好把多条 SQL 语言放在 begin transaction 和 commit 之 间,组成一个事务;
-
- InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会 失败;
-
- InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引 效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此, 主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文 件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
-
- InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而 MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很 快;
-
- Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询效率上 MyISAM 要高;
nosql 补充了mysql的速度
Mysql:就是必须有事务性,不要求你的速度很快,但是你的事务性必须强!
二.Mysql的优化
2.1 优化前的准备
你需要知道,我要优化谁?
我们的表很大,查询的条件也不同?----> 怎么找出优化点?优化查询耗费时间最长的sql,做优化
2.1.1 druid的监控
2.1.2 打开mysql 记录慢sql的功能
1)查询当前的mysql 是否开启了记录慢sql 日志的功能
show variables like ‘slow_query_log’;
True:代表开启了
False :关键
2)设置没有索引的记录到慢查询日志
set global log_queries_not_using_indexes=on;(打开记录功能)
3)查看超过多长时间的sql进行记录到慢查询日志
show variables like ‘long_query_time’
4)开启慢查询日志
set global slow_query_log=on
(5)设置超时时间
Set global long_query_time=5;–超过5s的语句才记录日志
(6)查看慢查询日志的位置
show variables like ‘slow%’
这几个操作,就是把系统里面慢的sql 语句定位出来
2.1.3 目标
找到执行sql 比较慢sql 语句!
2.2 如何分析慢sql语句
2.2.1 sql的编写的语句问题
2.2.2 sql语句的查询里面是否走了索引
三、sql编写问题
3.1 避免使用全表扫描
select * from xxx;
3.2 避免使用 null 值判断
使用null 判断也是全表的扫描,使用0 代替null
3.3 避免不等值判断
!= <>
也是做全表的扫描
假删除:status!=-1
Status = 1
3.4 避免使用 or 逻辑(是否所有的条件都有索引)
Select xx from xxx where exp =xx or exp 2= xxx;
Or 的条件里面,若一个查询的条件没有索引,则全部不走索引
Union:2 1 1
Or 可能会导致全表扫描
而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。
Union all 代表的是2个sql 语句
Union all 会直接把2个sql语句的执行结果直接返回,不会去重
因为在使用or的时候,不会走索引
而使用Union 是发不同的sql 语句,可以走索引
3.5 慎用 in 和 not in 逻辑
In 不是连续的数据规则
不会走索引的排序的效果
In(1,2,3);
Between(1,3);(因为很多的查询树都支持排序)
数据结构:到达是谁的查询速度最快?
Hash:hash的查询速度快 hashcode()-> 该值在某个空间的位置 几个hash 函数计算几次
二叉树:log(n)
In 查询,它的外层,不会走索引取查询
3.6 模糊查询(**)
Select xx,xxx from user where username like “%l%”
若条件“%l%” (最左匹配),就是你任何树的建立,都要有排序规则
username 建立了索引,也不会走索引?
1-10
1-5 6-10
A-c
https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
Select xx,xxx from user where username like “l%” 走索引
3.7 避免查询条件中字段计算
3.8 避免查询条件中对字段进行函数操作
在where 里面不要用?
3.9 WHERE 子句“=”左边注意点
3.10 组合索引使用
在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一 个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让 字段顺序与索引顺序相一致。将组合索引里面的第一个字段 让它在查询时起效果
可能导致该查询没有走索引
3.11 使用简单类型来代替mysql 里面复杂类型
能使用int 就不要使用bitint
能使用int 就不要使用vachar
3.12 其他的优化
3.13 在超大数量集的分页查询里面,可以说使用字查询来得到该数据的id,使用id 去表里面查询
select pk from table limit 10000,10 -> 只有10 条数据
Select xx,xx from table where id in(1,5,6,3,8,xx)
四、怎么有效的利用索引
4.1 要频繁查询的字段,必须建立索引
登录时:
Select xx ,xx from user where username = ‘ltd’; 、
4.2 在使用多条件查询时,我们可以考虑该多条件是否符合大多数查询的场景,若符合,则建立联合索引
在购物车里面,我们的索引使用联合索引
Shopid
Skuid
Userid
4.3 总结
就是要查询的字段,加索引,不使用该字段查询,就不需要索引
索引一般情况下都是高效的。不过凡是都有两面性,索引是以空间换时间的一种策略,索引本身在提高查询效率的同时会影响插入、更新、删除的效率。不当的使用索引不仅增加了写操作的负担,也会影响读取的效率。索引越多,数据库分析的越慢。注意点:
(1)InnoDB 每个索引都会加上主键,联合索引不要加上主键,innodb会自动加,否则会冗余。
(2)索引存在的目的是为了加快查询的效率,不过不是索引越多越好,建立索引要适当才好。过多的索引会增加数据库判断使用什么索引来查询的开销,所以,有时候也会出现以去掉重复或者无效的索引为优化手段的优化方式。
(3)主键已经是索引了,所以primay key 的主键不用再设置unique唯一索引了。
在sql 的优化**:尽量的使用索引来搜索。索引不是越多越好,合理就行,尽量在查询的条件字段上面加索引。**
五、表结构的优化
三大范式
一般表要自己设计,很少有 dba。
怎么设计:模仿别人设计的
5.1 ip 怎么存储?
可以使用inet_aton 来存储ip
5.2 时间的设计
From_unixtime 来把时间使用int 来存储
时间当成int 存储
5.3 text
Goods content 一般来说text 的数据量太大,导致你的sql 的结果集的数据量很大,其实很多时间我们不会需要该text,查询出来也是浪费,我们可以选择在查询时,不需要该字段
也可以把:
该text放在别的表里面,在使用时,使用联合查询把查询出来,拼接过期就ok 了
尽量少用text,非用不可最好分表,将text字段存放到另一张表中,在需要的时候再使用联合查询,这样可提高查询主表的效率。
六、数据库配置文件的优化
6.1 编码问题
将数据库的编码修改为utf-8
6.2 当数据库服务的内存和cpu 在比较好的清空下
可以增大数据库服务的连接的并发数,增大吞吐量
6.3 开启查询缓存
可以通过query_cache_type 来开启缓存
query_cache_type = 1 就是开启缓存
query_cache_type=2 不开缓存
但是我们一般是在应用层使用nosql 来缓存结果,并没有使用到mysql 提供的缓存机制
6.4 增大临时表的内存设置
一般在mysql 做统计计算,分组计算,需要一个临时表。
若内存小了,就会把该表放在磁盘上面,速度会变慢,增大它的内存设置,可以避免持久化的过程
七、硬件的优化
1h2g->2h-4h
八、分库分表
1万+

被折叠的 条评论
为什么被折叠?



