高性能Mysql(第三版)

1. Mysql架构和历史

  1. MyISAM只是将数据写到内存中,等待操作系统定期将数据刷出到磁盘上。所以,无法保证断电,数据不丢失。
  2. infobright用于Mysql数据量过大的时候,作为数据仓库。
  3. 修改表的引擎,会丢失表原引擎所有的特性。
  4. Mysqldump进行数据导入的时候,需要注意mysqlDump默认会在create table语句之间加载drop table,不注意这点,会导致数据库中原表的数据丢失。
  5. Mysql5.5开始InnoDB才成为了Mysql的默认引擎。

2. 服务器性能剖析

  1. 性能分析工具:
    1. NewRelic。
    2. xhprof。
  2. Mysql 5.0之后,慢查询日志可以显示毫秒级别。

3. Schema与数据类型优化

1. 整型比字符串类型代价更小。因为字符串需要字符集和校对规则。

2. 时间类型:

  1. DateTime:存储时间和日期,精确到秒。 <1001年 - 9999年>
  2. TimeSamp:存储时间和日期,精确到秒。只是DateTime一半的存储空间,并且会随着时区变化,具有特殊的自动更新能力。而且允许的时间范围更小一些。<1970年1月1日 - 2038年>

3. 整型类型:

  1. 数据范围:-2^(n-1) ~ 2^(n-1) - 1, N为空间位数。 且可以选择unsigned属性,表示不能为负数,正数的上限提高一倍。 对于指定整数长度是无用的,并不能限制存储的数值范围,只是控制了一些数据库的交互工具显示的数据位数。在存储和计算上,Int(1) 和 Int(20)是一致的。
    1. tinyInt: 8位空间。
    2. smallInt:16位。
    3. MediumInt: 24位。
    4. Int: 32位。
    5. BigInt: 64位。
  2. 实数类型:对于较小的数据使用decimal存储,对于数据量较大的时候,可以考虑使用bigInt代替Decimal,后面的小数乘以相应的倍数即可。
  3. 字符串类型:对于varchar可以变长的存储数据,不会清除数据末尾的空字符串;char则是固定长度,会自动清除数据末尾的空字符串。 MYISAM默认对字符串进行压缩索引,这会导致查询慢得多,导致性能大幅度下降。

4. 索引

较好的索引使用文章

  1. Where条件列使用了索引时:先在索引上按值进行查找,然后返回包含该值的所在行。
  2. 主键索引和非主键索引是有区别的,主键索引存放的值是整行字段的数据,而非主键索引上存放的值不是整行字段的数据,而且存放主键字段的值。

2. 最左前缀:

当使用复合索引的时候,只有按照索引键顺序使用,才能使用到索引。跳过最左键则无法使用到索引。

3. 覆盖索引:Select 的列,是索引中定制的列。

4. 索引的作用

  1. 让服务器快速定位到表指定的位置。
  2. 减少了服务器需要扫描的数据量。
  3. 避免排序和临时表的产生。
  4. 将随机I/O转换为顺序I/O。

5. 前缀索引

  1. 定义: 对于Blob和Text,或是很长的varchar类型的列,若是使用普通索引,因为数据量很大,会导致索引空间剧烈增长,所以,为了减小索引空间,因此,索引前缀就好。而且对于mysql对于这三种类型,不允许索引这些列的全部长度。
  2. 计算最合适的前缀长度:COUNT(DISTINCT LEFT(name, 1)) / count(*) AS pre1。修改长度。
  3. 实现:Alter TABLE user ADD KEY (name(8)); 8:是对于name这列设置的索引前缀长度。

6. 合并索引

  1. 在mysql5.0之前,是无法把多个索引同时使用,只能使用让单个索引起效。而mysql 5.0之后,则当创建的索引存在问题,mysql会进行索引优化,把可以用到的索引,合并成一个索引使用。

7. 聚簇索引

  1. 定义: 不是索引类型,而是一种数据存储方式。在InnoDB中的聚簇索引实际上在同一个结构保存了一个B-Tree索引和数据行。索引节点对应的数据实际存放在索引的叶子页上。 因为无法同时把数据行存放在两个不同的地方,一个表中只能存在一个聚簇索引。
  2. InnoDB通过主键聚集数据。
  3. optimize table你删除数据时,mysql并不会回收,被已删除数据的占据的存储空间,以及索引位。而是空在那里,而是等待新的数据来弥补这个空缺,这样就有一个缺少,如果一时半会,没有数据来填补这个空缺,那这样就太浪费资源了。所以对于写比较频烦的表,要定期进行optimize,一个月一次,看实际情况而定了。

8. 覆盖索引

  1. 定义:select中字段,都在索引中存在,便不需要再回表查询数据。将大大提高性能。

9. 使用索引扫描来做排序

  1. mysql生成有序的结果,只能通过排序操作和按索引顺序扫描
  2. 若是explain之后的type为index,则说明使用了索引顺序扫描的方法排序。
  3. mysql可以使用同一个索引既满足排序,又满足查找行数据。
  4. 实现:
    1. 只有当索引的列顺序和ORDER BY子句的顺序完全一致,并且所有的排序方向(倒序或正序)都一样时,mysql才会使用索引来对结果做排序。
    2. 若是查询需要关联多张表,则只有当ORDER BY子句引用的字段全部为第一个表时,才能使用索引进行排序。ORDER BY也得满足索引的最左前缀。
    3. 若是索引的第一个列是常数,则ORDER BY可以不需要满足最左前缀。eg: where name = ‘Alex’ order by age。 index(name, age)。 但是,若是拍序列的顺序方向和索引顺序不一致也无法使用到索引。

10. 压缩(前缀压缩)索引

  1. 定义:通过压缩前缀,减小索引的存储空间,让更多的索引可以放入内存中。默认只能压缩字符串,整数需要通过参数设置。
  2. 计算方法:先完全保存索引块中的第一个值,然后将其他值和第一个值进行比较得到相同的前缀的字节数和剩余不同的后缀部分,把这部分呢存储起来即可。eg: 1. perform 2. performance, 存储的时候,存储的数据:7,ance。

11. 冗余和重复索引

  1. 定义:重复索引指的是在相同的列上按照相同的顺序创建相同类型的索引。

12. 索引和锁

  1. 在mysql5.1之后,InnoDB可以在服务端过滤掉行后就释放锁,但是在mysql早期版本中,只有当事务提交之后,才会释放锁。

13. 优化排序

  1. Distinct:执行之后会产生一个中间表,会降低性能,出现Using temporary。
  2. Using fileSort: 因为排序的数据过大,在文件中进行排序了,增加索引,排序字段在索引中。

5. 查询优化

  1. using(Field): field必须是两个表中一样的名称,才能使用。相当于ON的功能。
select t1.id, t1.name
from test t1
inner join test2 using (id)
等同于
inner join test2 t2 ON t2.id = t1.id
  1. 连表查询的时候,关联表拿出来的字段最好放在索引中,可是使用索引数据,不需要返回到数据行获取数据。
  2. 延迟关联:获取需要访问的记录后再根据关联列返回原表查询需要的所有列。这个技术可以用于优化关联查询中的limit子句。
问题:查询多少页的多少条数据
1.常规查询
SELECT id,name,age
FROM `user`
LIMIT 50, 5

2.延迟关联
SELECT  id, name, age
FRO `user`
INNER JOIN (   // 先查询出需要的id,因为id是主键存在索引,可以直接从索引中,获取到需要的id。
	SELECT id	// 再使用inner join,根据id,查询需要的其余列。
	FROM `user`
	LIMIT 50, 5
) as user1 USING(id)


猜你喜欢

转载自blog.csdn.net/weixin_38608626/article/details/88817456
今日推荐