1.索引

语法细节(要点)

在满足索引使用的场景下(where/order by/join on或索引覆盖),索引也不一定被使用

字段要独立出现

比如下面两条SQL语句在语义上相同,但是第一条会使用主键索引而第二条不会。

select * from user where id = 20-1;
select * from user where id+1 = 20;

like查询,不能以通配符开头
比如搜索标题包含mysql的文章:

select * from article where title like '%mysql%';

这种SQL的执行计划用不了索引(like语句匹配表达式以通配符开头),因此只能做全表扫描,效率极低,在实际工程中几乎不被采用。而一般会使用第三方提供的支持中文的全文索引来做。

但是 关键字查询 热搜提醒功能还是可以做的,比如键入mysql之后提醒mysql 教程、mysql 下载、mysql 安装步骤等。用到的语句是:

select * from article where title like 'mysql%';

这种like是可以利用索引的(当然前提是title字段建立过索引)。

2.查询缓存

在[mysqld]段中配置query__type:
• 0:不开启
• 1:开启,默认缓存所有,需要在SQL语句中增加select sql-no-
提示来放弃缓存
• 2:开启,默认都不缓存,需要在SQL语句中增加select sql-***来主动缓存(==常用==)

更改配置后需要重启以使配置生效,重启后可通过show variables like ‘query_***_type’;来查看:

当数据表改动时,基于该数据表的任何缓存都会被删除。

3.分区

当数据量较大时(一般千万条记录级别以上),MySQL的性能就会开始下降,这时我们就需要将数据分散到多组存储文件,==保证其单个文件的执行效率==。

最常见的分区方案是按id分区,如下将id的哈希值对10取模将数据均匀分散到10个.ibd存储文件中:

create table article(
    id int auto_increment PRIMARY KEY,
    title varchar(64),
    content text
)PARTITION by HASH(id) PARTITIONS 10

4.水平分割和垂直分割

水平分割:通过建立结构相同的几张表分别存储数据

垂直分割:将经常一起使用的字段放在一个单独的表中,分割后的表记录之间是一一对应关系。