数据库索引、sql优化、引擎

索引

1.索引分类:
唯一/非唯一、聚集/非聚集、主键索引(是特殊的唯一索引)、联合索引。

2.聚集/非聚集的区别
①定义:聚集索引,表记录的物理顺序与键的索引排列顺序一致(我的理解是:索引和记录按顺序排);非聚集索引,表记录的物理顺序与键的索引排列顺序不一致(我的理解是:索引和记录不按顺序排)。
②优缺点:聚集索引,查询速度快,一旦第一个被找到,后续的索引记录就被找到了;但修改慢,一旦修改一个值,就需要维护索引的相应顺序,导致效率低下。所以适用场景为范围查找、包含小数目的不同值。
非聚集索引,修改速度快,不用维护索引的顺序;适用场景为包含大数目的不同值、频繁更新的列。

索引在什么情况会失效

1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因),要想同时使用or和索引就需要在or条件的每一列加索引。
2.like语句以%开头的,索引会失效,比如%aaa。以%结尾的不会失效。
3.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。
4.如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

此外,查看索引的使用情况:show status like ‘Handler_read%’;

sql优化

1.避免全表扫描,在where、order by 、group by涉及的列上建索引。
2.可以查看语句的执行计划,用来提高优化效率(比如我们建立了一个联合索引a,b,c 当我的where语句后面只用了b=’xx’,我们在执行计划里可以看出联合索引没有用上,我们在where后加上了a=‘xx’,b=‘xx’时索引就用上了,这样效率就提高了)。
重要的字段:

id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.

select_type: SELECT 查询的类型.

table: 查询的是哪个表

partitions: 匹配的分区

type: join 类型

possible_keys: 此次查询中可能选用的索引 key: 此次查询中确切使用到的索引. ref: 哪个字段或常数与 key 一起被使用 rows: 显示此查询一共扫描了多少行. 这个是一个估计值. filtered: 表示此查询条件所过滤的数据的百分比 extra: 额外的信息

2.对表进行拆分
①垂直拆分:主键和常用的列放一个表,不常用的放一个表。
3.分区分库。

数据库的访问量大了怎么办?主从复制、读写分离、redis缓存、数据库分表分区分表、sql优化。

引擎

一、innoDB
1.索引文件就是数据文件(索引叶节点保存的data值)
2.辅助索引叶节点保存的主键索引的值,使用辅助索引时要检索两边索引,要先检索主键的值,再检索相应记录。
二、myISAM
1.数据文件和索引文件分离(叶节点保存数据的地址)。
2.辅助索引几乎和主键索引一样,只是辅助索引不要求键唯一。

三、几点区别
1.myISAM的一般情况下性能较好,innoDB支持事务(针对修改操作)。
2.myISAM不支持外键,innoDB支持外键。
3.前者支持表级锁,后者支持表级锁和行级锁,默认行级锁。行级锁提高了并发性能。innodb适合插入和更新操作,myisam适合频繁查询情况。
4.前者允许没有主键,后者若密友主键会自动生成一个主键(用户不可见)。

你可能感兴趣的:(数据库)