【MySQL】数据库优化

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/ca1m0921/article/details/90210553

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

猜你喜欢

转载自blog.csdn.net/ca1m0921/article/details/90210553