数据库
首页 > 数据库> > 高并发,高性能,高可用MySQL 实战-怎么查询速度更快

高并发,高性能,高可用MySQL 实战-怎么查询速度更快

作者:互联网

怎么查询速度更快

where查询太慢怎么办

  1. 覆盖索引

是否会使用覆盖索引,看下面的例子: 第一个会使用,第二个不会使用
explain select inventory_id, store_id, film_id from inventory where store_id = 1;
explain select inventory_id, store_id, film_id, last_update from inventory where store_id = 1;

何时使用覆盖索引,当我们的一个表中经常要查询的数据就那么两个字段,如果我们给这两个字段建立联合索引,就可以避免二次回表,提升查询性能

总结,重点:

有更合适的索引不走,怎么办

  1. 如何确定用哪条索引

索引基数的应用
索引基数就是数据列所包含的不同值的数量

  1. 强制使用索引
    在sql语句后面加上 force index 强制使用索引

  2. 优化索引

总结,重点:

count()这么慢怎么办

  1. count()函数用来统计计算结果集中不为null的个数
  1. count(非索引字段)时,server层需要判断每个数据是否为null
  1. count(索引字段)可以覆盖,依然需要每次判断字段是否为null

count(索引字段)已经比count(非索引字段)效率要高了,因为不需要回表,但是还是需要每次判断字段是否为null

  1. count(1)只有扫描索引树,没有解析数据行的过程,理论更快
    但是server层依然需要判断1是否为null

  2. count(*) 一般用来返回数据表行数

总结:

order by 这么慢,怎么办?

  1. mysql排序前会将查询的结果放到中间结果集
  2. 回表生成完整结果集
  3. 最高效,索引覆盖

    总结:
  4. mysql排序一般要需要生成中间结果集、排序、回表的过程
  5. 索引覆盖是最高效的需要处理排序的方式

随机选取这么慢怎么办

order by rand()原理

  1. 查询流程需要生成两个临时表
  2. 为什么会这么慢
  3. 解决方案-临时方法
select max(film_id), min(film_id) into @M,@N from film;
set @X = floor((@M-@N+1)*rand()+@N);
select title, description from film where film_id >= @X limit 1;
  1. 解决方案-业务方案
select film_id, title, description from film limit 1 offset 850;
-- 或,它们两个是等价的
select film_id, title, description from film limit 850, 1

总结:

3

标签:count,覆盖,索引,并发,高性能,MySQL,null,id,film
来源: https://www.cnblogs.com/mayanan/p/16030960.html