mysql 修改字符集编码之后重启创建的数据库能够生效。
mysql 修改字符集编码之后重启不能对修改字符集之前的数据库产生影响(该乱码还是得乱码)
frm文件:数据库结构文件
myd文件:存放的是表数据
myi文件:存放的是数据索引
mysql数据库的分层:
第一层:连接层
第二层:服务层,主要完成的是核心服务功能,如:SQL接口,并完成缓存的查询,SQL分析和优化及部分内置函数的执行。
第三层:引擎层,存储引擎。存储引擎真正的负责了Mysql中数据的存储和提取,通过api和存储引擎进行通信。不同的引擎有不同的特点:常用的是InnoDB和MyIsam
第四层:存储层,主要是将数据存储在运行与裸设备的文件系统之上,并完成与存储引擎的交互。
sql性能下降、执行时间长的原因和处理方式?
1.sql本身写的不好
2.索引失效
3.关联查询太多(join太多)
4.mysql数据库的配置:如缓冲、线程数
mysql机读的时候先读什么关键字?
join关键字 :
inner join :两个表的交集
left join : 左表的全部 + 右表的交集
right join :两个表的交集 + 右表的全部
left join + b.key is null : 左表的全部 - 和右表的交集
full outer join : 全连接
union : 将两者的sql结果去重合并
-- inner join 交集
SELECT * FROM t_user u INNER JOIN t_model m on u.`name` = m.userId;
-- lefet JOIN 左连接:左边的全部数据 + 右边和左边交集key的数据
SELECT * FROM t_user u LEFT JOIN t_model m on u.`name` = m.userId;
-- RIGHT JOIN 又连接:右边的全部数据 + 左边和右边交集key的数据
SELECT * FROM t_user u RIGHT JOIN t_model m ON u.`name` = m.userId;
-- 左边的数据除去和右边有外键关联的数据
SELECT * FROM t_user u LEFT JOIN t_model m ON u.`name` = m.userId WHERE m.userId is NULL;
-- 右边的数据除去和左边有外键关联的数据
SELECT * FROM t_user u RIGHT JOIN t_model m on u.`name` = m.userId where u.id is NULL;
-- 左边除掉右边关联数据 + 右边除去左边关联数据
SELECT * from t_user u LEFT JOIN t_author a on u.id = a.id where a.id is NULL
UNION
SELECT * from t_user u RIGHT JOIN t_author a on u.id = a.id WHERE u.id is null
mysql索引:帮助mysql高效获取数据的数据结构。提高查找效率,类比于字典。
索引的本质:索引是数据结构。排好序的快速查找的数据结构。 where order by
建立了索引的数据库最好不要真正的删除索引。
涉及到了大量数据的创建和删除之后可能会需要重建索引。
索引的优点:
1.提高了数据的检索效率,减少了数据库的IO成本。
2.索引对数据进行排序,降低了排序成本,减少了cpu的消耗。
索引的劣势:
1.索引也会占用空间,大量索引会出现索引消耗资源太多。
2.插入、删除、修改数据的时候还需要创建、修改、删除数据,增加数据库的压力。
索引的分类:
1.单一索引:一个索引只包含一个列,一个表可以有多个单一索引。一个表最多最好建立五个单一索引
2.复合索引;一个索引包涵多个列,查找的还是遵循索引最左原则
3.唯一索引:索引列的值必须唯一,但是允许为null
什么时候创建索引?
1.主键自动创建唯一索引
2.频繁作为查询条件的字段应该创建索引
3.查询中又外键关系的字段应该创建索引
4.尽量创建复合索引
5.where、order、group后面的数据需要创建索引
什么时候不创建索引?
1.表的数据少
2.经常进行增删改查的字段
3.字段只有几个值的字段比如:国籍、性别、boolean,这样创建索引对查询速度提升不大。
mysql的性能分析?
1.mysql有自己的最优处理分析器。
2.CPU\IO
3.EXPLAIN:分析报告
1.explain执行计划
2.id:决定了表的读取顺序(表的读取顺序并不是sql中的书写顺序)
值相同的时候从table由上到下执行
值不相同时由id最大的table执行到最小的table
值相同不同,先执行值最大的,然后顺序执行值小的两张表
3.select_type: 读取数据的操作类型
simple:简单的查询,不包含子查询和union
primary: 查询中包涵任何的子查询
subquery:在select或者where条件中包含了子查询
union:
union result:
4.type : 最好是要都能达到range(范围)、ref,需要避免all查询
system(只有一条数据) > const(唯一主键常量查询) > eq_ref(联合查询,第二张表只有一条记录) > ref > range > index > all
5.key : 实际使用的索引,null表示没有命中索引,或者说该字段根本就没有索引
6.possible-key : 理论上使用到的索引
7.key_len : 索引key的长度。在查询结果一致的情况下key_len 越短越好
8.rows : mysql优化器扫描的行数
9.extra :额外信息
using filesort :order by后面不能命中索引,索引排序不对,mysql自动重新排序。(索引质量低下,比较危险需要重建索引)
using temporary:使用临时表保存中间结果并分组(非常不友好)