Mysql优化一
mysql优化
一、存储引擎
1.查看所有引擎
show engines;
2.查看默认存储引擎
show variables like '%storage_engine%';
3.myisam和innodb
对比项 | myisam | innodb |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其他行有影响,适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存的要求较高,而且内存的大小对其性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | yes | yes |
二、sql执行加载顺序
from left_table on join_condition <join_type> join right_table where where_condition group by group_condition having having_condition select distinct select_list order by orderby_condtion limit limit_num
三、索引
1.定义
索引是帮助mysql高效获取数据的数据结构。——>本质:数据结构。
其目的在于提高查询效率,可以类比于字典,可以简单理解为排好序的快速查找数据结构。
数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。
通常说的索引如果没有特别指明,说的都是b树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引默认都是使用b+树索引,统称索引。当然,除了b+树这种类型的索引之外,还有哈希索引等
索引会影响到查找和排序
一般来说索引也很大,不可能全部存储在内存中,因此索引往往以索引文件的方式存储在磁盘上。
2.特点
优点:提高数据检索的效率,降低了数据库的io成本。
通过索引对数据进行排序,降低数据排序的成本,降低了cpu的消耗。
缺点:实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也是占用空间的。
虽然其大大调高了查询速度,同时却会降低更新表的速度。因为更新表时不仅要保存数据,还要保存一下 索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
索引只是提高效率的一个因素,如果你的数据库拥有大量的表,就需要花时间研究建立最优秀的索引,或 优化查询。
3.分类
-
单值索引
一个索引只包含单个列,一个表可以有多个单值索引。
-
唯一索引
索引列的值必须唯一,但允许有空值
-
复合索引
一个索引包含了多个列
4.基本语法
创建:unique是唯一索引, columnname只有一个是单值索引,有多个为复合索引
create [unique] index indexname on tablename(columnname1, columnname2...) or alert tablename add [unique] index [indexname] on (columnname1, columnname2...)
删除:
drop index [indexname] on tablename
查看
show index from tablename
5.适合建立索引的情况
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- 查询中排序的字段,排序字段若通过索引去访问,将大大提高排序速度
- 单键/组合索引的选择问题(高并发适合创建组合索引)
- 查询中统计或分组的字段
6.不适合创建索引的情况
频繁更新的字段
where条件里用不到的字段
表记录太少
-
数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据建立索引
索引的选择性=不同的数目/总数目
推荐阅读
-
探讨:Oracle数据库查看一个进程是如何执行相关的实际SQL语句
-
SQL Server中将多行数据拼接为一行数据(一个字符串)
-
CASE表达式实现基于条件逻辑来返回一个值
-
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
-
css选择器(一)基本选择器
-
sqlserver清除完全重复的数据只保留重复数据中的第一条
-
sql语句优化之SQL Server(详细整理)
-
Yii2框架中一些折磨人的坑
-
sql中循环处理当前行数据和上一行数据相加减
-
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...