1、多列索引:

      多列索引的查询标准:列的查询频率、列的区分度、列的顺序  要集合实际环境,进行日常的统计分析。比如:先按栏目查询然后再对栏目下的品牌分类进行查询然后对价格查询,那么索引的顺序就应该是 index(cat_id,brand_id,price)

2、索引与排序:

       对于InnoDB来说,沿着索引走一遍,那么整个查询就是有序的。因为InnoDB是聚簇索引。索引的叶子节点上含有数据

3:Extra:filesort

      select goods_id ,goods_name from ecs_goods order by goods_id // 如果 goods_id 为索引的话,那么因为有goods_name 的存在 使得 MySql会先执行查询全部数据,然后再去进行排序,索引没有发挥作用,所以查询时间长。

      select goods_id,goods_name from ecs_goods where cat_id>3 order by goods_id 有相应的限制,索引就用到了,时间也有下降。

      尽量防止 Extra:filesort 的出现,这样就需要优化。如果一个语句中出现了 where 索引和order by 索引不一致,Extra :会出现 filesort

4:重复索引和冗余索引:

      重复索引没有什么实际意义;

      冗余索引对与某些场景是适用的:

index(id,tag) index(tag,id) ,这样在每次查询的时候,不管是使用id 或者使用tag 都是可以利用到索引覆盖的。从而提高查询效率

5:索引碎片和索引维护:

     对于索引碎片,是由于数据在不断的变化中产生的。

     修复索引碎片:需要做的是把索引和数据重新整理放好。可以通过以下方式处理:

     alter table es_company engine innodb; 

     optimiza table es_vourcherApply;

     //以上语句所做的操作对数据表没有实质影响。

6:SQL语句的优化

     查询时间主要分为 查找数据时间+取数据时间+传输的时间

 查找数据时间:    利用索引进行查找

取出数据时间:    用索引覆盖

     传输数据时间:    将例如10000条数据分开处理

7:Sql语句不是越长越好:

      比如:需求查询栏目3下的商品

      select  cat_id ,cat_name from cat where cat_id=3;

      select  goods_id,goods_name from goods where cat_id=3;

      select cat_id ,cat_name,goods_id,goods_name from cat left join goods where cat_id=3;  

      以下的实现方式会出现多次 cat_id,cat_name 的情况


cat_id

cat_name

goods_id

goods_name

1

PHONE

10

NOKIA

1

PHONE

20

HUIWEI

1

PHONE

30

OPPO