搜尋

首頁  >  問答  >  主體

php - MYSQL 索引優化的經典問題,

問題如下:

就像這樣的

表結構如下:

CREATE TABLE `lmx_app_category` (
  `id` int(11) NOT NULL DEFAULT '0' COMMENT '分类编号',
  `pid` tinyint(4) NOT NULL DEFAULT '1' COMMENT '分类的类型(目前两个 1:应用,2:游戏)',
  `name` varchar(50) NOT NULL COMMENT '分类名称',
  PRIMARY KEY (`cat_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='应用分类表';

CREATE TABLE `lmx_apps` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'app编号',
  `cat_id` int(11) NOT NULL DEFAULT '0' COMMENT '分类编号',
  `name` varchar(100) NOT NULL COMMENT 'app名称',
  `year` char(5) NOT NULL DEFAULT '0' COMMENT '年份',
  `down_count` bigint(20) NOT NULL DEFAULT '0' COMMENT '下载量',
  `hit_count` bigint(20) DEFAULT '0' COMMENT '搜索量',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


我現在建立了兩個聯合索引:

但是這個兩個索引存在幾個問題,如果我點擊搜尋全部 那麼 排序就不會走索引,怎麼解決這個搜尋分類時選擇 全部 不走索引的問題、

走索引的 sql 如下:

    -- EXPLAIN 
 SELECT a.id,a.cat_id,a.`name`,a.down_count,b.`name` FROM `lmx_apps` a

 INNER JOIN `lmx_app_category` `b` 
 
 ON `a`.`cat_id`=`b`.`id`

  WHERE 
   a.cat_id = 103
    

   ORDER BY a.down_count DESC
    
 LIMIT 10,20
 
 

不走索引的 sql 如下

 SELECT a.id,a.cat_id,a.`name`,a.down_count,b.`name` FROM `lmx_apps` a

 INNER JOIN `lmx_app_category` `b` 
 
 ON `a`.`cat_id`=`b`.`id`

  -- WHERE 
  -- a.cat_id IN (SELECT cat_id FROM lmx_app_category WHERE orgame = 1)
  -- 当没有 cat_id 这个条件 或者这个条件为 in 时 

 ORDER BY a.down_count DESC
    
 LIMIT 10,20
某草草某草草2752 天前557

全部回覆(1)我來回復

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-16 13:09:33

    現在想到另一個方案,就是

    把應用程式表的 cat_id欄位和cat_id 建立的索引刪掉

    分類表(lmx_app_category)和應用表(lmx_apps)建立一個關聯表,

    欄位為 id,app_id,cat_id

    在這個關聯表上面建立 索引,不知道這種方案怎麼樣

    回覆
    0
  • 取消回覆