欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【MySQL】数据库优化

程序员文章站 2022-06-02 12:15:55
...

1. 分表:

https://www.cnblogs.com/miketwais/articles/mysql_partition.html

问题:

Innodb  和 MyISAM 的区别 ?

 

什么时候用分表 什么时候 用 redis ?

 

MySQL 的主要优化方法有哪些?

 

MySQL 的 主从同步如何设置?

文档:https://pan.baidu.com/s/1m4emSwhCv9BptnsDILwk3A   提取密码 : zv8r

 

 

1. 全值匹配 : 联合索引的情况下,使用了所有的索引值 查询。

2. 匹配左边:按顺序 索引, 缺少第一个 索引字段的情况下,索引将完全失效。

2. 列前缀匹配:  模糊查询时,使用前缀匹配,因为 只有前缀是 排序的。

3. 精准匹配 和 范围匹配:  并存

4. 索引用于排序: 避免 文件排序(读入内存之后排序)

SELECT * FROM person_info ORDER BY name, birthday, phone_number LIMIT 10;

5.使用联合索引进行排序注意事项:索引的顺序不能颠倒。(在 where 中有 索引优化器,所以可以颠倒,此处不支持)

SELECT * FROM person_info WHERE name = 'A' ORDER BY birthday, phone_number LIMIT 10;

6. WHERE子句中出现非排序使用到的索引列

SELECT * FROM person_info WHERE country = 'China' ORDER BY name LIMIT 10;

7.排序列包含非同一个索引的列

SELECT * FROM person_info ORDER BY name, country LIMIT 10;

8.排序列使用了复杂的表达式

SELECT * FROM person_info ORDER BY UPPER(name) LIMIT 10;

9.用于分组

SELECT name, birthday, phone_number, COUNT(*) FROM person_info GROUP BY name, birthday, phone_number

10. 查询 带非聚集索引 的表,需要做 回表操作:

在索引中查询时,查询到数据之后,会进行 顺序I/O处理, 在回表操作中,每个数据的 记录不在磁盘的连续位置,所以 要做 随机I/O。

如果 二级索引查询到的数据太多,需要到 聚集索引中做 随机I/O。效率很低,不如不用 二级 + 聚集索引。

而,MySQL设计中 存在一个 索引优化器,会对查询的工作量做统计计算操作,来判断 是否使用 二级 + 回表操作。

SELECT * FROM person_info ORDER BY name, birthday, phone_number;

select  *  通常考虑 聚集索引。 加 limit  *;限制,考虑 二级索引 + 回表操作。

11. 覆盖索引

SELECT name, birthday, phone_number FROM person_info WHERE name > 'Asa' AND name < 'Barlow'

为了彻底告别回表操作带来的性能损耗,我们建议:最好在查询列表里只包含索引列

 

12. 如何挑选索引:

  1. 只为用于搜索、排序或分组的列创建索引 :出现在 where   、  group by   、 orader by 的列需要,出现在select 的不用。

  2. 考虑列的基数: 可选的值,越多,越值得。

  3. 索引列的类型尽量小 :  查询会快、 占用空间 会少(主键的情况下,二级索引中也能节省空间)

   4. 索引字符串值的前缀 :

CREATE TABLE person_info(
    name VARCHAR(100) NOT NULL,
    birthday DATE NOT NULL,
    phone_number CHAR(11) NOT NULL,
    country varchar(100) NOT NULL,
    KEY idx_name_birthday_phone_number (name(10), birthday, phone_number)
);    

 

 

 

 

 

 

000000