找回密码
 免费注册

[开发文档] 呆错文章管理系统LIKE查询优化

[复制链接]
admin 发表于 2023-1-10 23:38:05 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 10000 个金币 才能浏览
回复

使用道具 举报

 楼主| admin 发表于 2023-1-11 11:20:01 | 显示全部楼层
查询参数实例

  1. $args = [
  2.     'cache'    => true,
  3.     'status'   => 'normal',
  4.     'action'   => 'index',
  5.     'controll' => 'detail',
  6.     'module'   => 'cms',
  7.     'field'    => config('cms.field_select'),
  8.     //'simple'   => false,
  9.     'sort'     => 'info.info_id',
  10.     'order'    => 'desc',
  11.     //'parent'   => ['eq',0],
  12.     //'user_id'  => ['eq',1],
  13.     //'id'       => ['gt',1000],
  14.     //'name'     => ['like','%游戏%'],
  15.     /*'term_id'  => 70,
  16.     'meta_key' => ['eq','cms_up'],
  17.     'meta_value' => ['gt',1],
  18.     'meta_query' =>[
  19.         [
  20.           'key'  =>['eq','cms_letter'],
  21.           'value'=>['in','a,b'],
  22.         ],
  23.     ],*/
  24.     'paginate' => [
  25.         'list_rows' => 10,
  26.         'page'      => $this->site['page'],
  27.     ]
  28. ];
复制代码
生成的SQL语句实例
  1. SELECT `info`.* FROM `dc_info` `info`
  2. INNER JOIN (SELECT `info_id` FROM `dc_info` LIMIT 490,10) tid ON `tid`.`info_id`=`info`.`info_id`
  3. INNER JOIN (SELECT `info_id` FROM `dc_info` WHERE  `info_status` = 'normal'  AND `info_action` = 'index'  AND `info_controll` = 'detail'  AND `info_module` = 'cms') tcount ON `tcount`.`info_id`=`info`.`info_id`
  4. INNER JOIN (SELECT `detail_id` FROM `dc_term_map` WHERE  `term_id` = 70) tmap ON `tmap`.`detail_id`=`info`.`info_id`
  5. INNER JOIN (SELECT `info_id` FROM `dc_info_meta` WHERE  `info_meta_key` = 'cms_up'  AND `info_meta_value` > '1') tmeta ON `tmeta`.`info_id`=`info`.`info_id`
  6. INNER JOIN (SELECT `info_id` FROM `dc_info_meta` WHERE  `info_meta_key` = 'cms_letter'  AND `info_meta_value` = 'a') tmeta0 ON `tmeta0`.`info_id`=`info`.`info_id`
  7. ORDER BY `info`.`info_id` DESC
  8. limit 100,10
复制代码


回复

使用道具 举报

 楼主| admin 发表于 2023-1-11 18:56:48 | 显示全部楼层
  1. <?php
  2. namespace app\cms\controller;

  3. use app\common\controller\Front;

  4. class Test extends Front
  5. {
  6.     private $info = [];
  7.    
  8.     private $items = [];
  9.    
  10.     public function _initialize()
  11.     {
  12.         parent::_initialize();
  13.     }
  14.    
  15.     public function index()
  16.     {
  17.         //查询参数
  18.         $args = [
  19.             'cache'    => true,
  20.             'status'   => 'normal',
  21.             'action'   => 'index',
  22.             'controll' => 'detail',
  23.             'module'   => 'cms',
  24.             'field'    => config('cms.field_select'),
  25.             //'simple'   => false,
  26.             'limit'    => 10,
  27.             'page'     => 5,
  28.             'sort'     => 'info.info_id',
  29.             'order'    => 'desc',
  30.             //'parent'   => ['eq',0],
  31.             //'user_id'  => ['eq',1],
  32.             //'id'       => ['gt',1000],
  33.             //'name'     => ['like','%游戏%'],
  34.             /*'term_id'  => 70,
  35.             'meta_key' => ['eq','cms_up'],
  36.             'meta_value' => ['gt',1],
  37.             'meta_query' =>[
  38.                 [
  39.                   'key'  =>['eq','cms_letter'],
  40.                   'value'=>['in','a,b'],
  41.                 ],
  42.             ],*/
  43.             'paginates' => [
  44.                 'list_rows' => 10,
  45.                 'page'      => $this->site['page'],
  46.             ]
  47.         ];
  48.         //初始字段
  49.         if(config('database.type') == 'mysql'){
  50.             $args['field'].=',info.info_id';
  51.         }else{
  52.             $args['field'] = 'info.*';
  53.         }
  54.         //$sqlId = db('info')->field('info_id')->where($where)->limit(10)->page(50)->order('info.info_id desc')->fetchSql(true)->select();
  55.         $sqlId = db('info')->field('info_id')->limit(10)->page(50)->fetchSql(true)->select();
  56.         dump($sqlId);
  57.         //联合索引
  58.         $sqlFilter = db('info')->field('info_id')->where(DcWhereFilter($args, ['module','controll','action','status','type'], 'eq', 'info_'))->fetchSql(true)->select();
  59.         //初始参数
  60.         $defaults = array();
  61.         $defaults['cache']    = true;
  62.         $defaults['group']    = '';
  63.         $defaults['fetchSql'] = true;
  64.         $defaults['field']    = 'info.*';
  65.         $defaults['alias']    = 'info';
  66.         $defaults['with']     = 'info_meta,term,user';
  67.         $defaults['view']     = [];
  68.         $defaults['join']     = [
  69.             //['('.$sqlId.') tid','tid.info_id = info.info_id'],
  70.             ['('.$sqlFilter.') tcount','tcount.info_id = info.info_id'],
  71.         ];
  72.         $defaults['where']    = DcWhereFilter($args, ['id','title','excerpt','password','mime_type','views','hits'], 'eq', 'info_');
  73.         $defaults['paginate'] = [];
  74.         $defaults['sort']     = 'info.info_id';
  75.         $defaults['order']    = 'desc';
  76.         //info_parent
  77.         if($args['name']){
  78.             $sql = db('info')->field('info_id')->where(['info_name'=>DcWhereValue($args['name'],'eq')])->fetchSql(true)->select();
  79.             array_push($defaults['join'],['('.$sql.') tname','tname.info_id = info.info_id']);
  80.         }
  81.         //info_slug
  82.         if($args['slug']){
  83.             $sql = db('info')->field('info_id')->where(['info_slug'=>DcWhereValue($args['slug'],'eq')])->fetchSql(true)->select();
  84.             array_push($defaults['join'],['('.$sql.') tslug','tslug.info_id = info.info_id']);
  85.         }
  86.         //info_parent
  87.         if($args['parent']){
  88.             $sql = db('info')->field('info_id')->where(['info_parent'=>DcWhereValue($args['parent'],'eq')])->fetchSql(true)->select();
  89.             array_push($defaults['join'],['('.$sql.') tparent','tparent.info_id = info.info_id']);
  90.         }
  91.         //info_user_id
  92.         if($args['user_id']){
  93.             $sql = db('info')->field('info_id')->where(['info_user_id'=>DcWhereValue($args['user_id'],'eq')])->fetchSql(true)->select();
  94.             array_push($defaults['join'],['('.$sql.') tuser','tuser.info_id = info.info_id']);
  95.         }
  96.         //info_create_time
  97.         if($args['create_time']){
  98.             $sql = db('info')->field('info_id')->where(['info_create_time'=>DcWhereValue($args['create_time'],'gt')])->fetchSql(true)->select();
  99.             array_push($defaults['join'],['('.$sql.') tcreate','tcreate.info_id = info.info_id']);
  100.         }
  101.         //info_update_time
  102.         if($args['update_time']){
  103.             $sql = db('info')->field('info_id')->where(['info_update_time'=>DcWhereValue($args['update_time'],'gt')])->fetchSql(true)->select();
  104.             array_push($defaults['join'],['('.$sql.') tupdate','tupdate.info_id = info.info_id']);
  105.         }
  106.         //term_map
  107.         if($args['term_id']){
  108.             $sql = db('term_map')->field('detail_id')->where(['term_id'=>DcWhereValue($args['term_id'],'eq')])->fetchSql(true)->select();
  109.             array_push($defaults['join'],['('.$sql.') tmap','tmap.detail_id = info.info_id']);
  110.         }
  111.         //info_meta
  112.         if($args['meta_key'] || $args['meta_value']){
  113.             $sql = db('info_meta')->field('info_id')->where(DcWhereFilter($args, ['meta_key','meta_value'], 'eq', 'info_'))->fetchSql(true)->select();
  114.             array_push($defaults['join'],['('.$sql.') tmeta','tmeta.info_id = info.info_id']);
  115.         }
  116.         //info_meta_query
  117.         if($args['meta_query']){
  118.             foreach($args['meta_query'] as $key=>$value){
  119.                 $sql = db('info_meta')->field('info_id')->where(DcWhereFilter($value, ['key','value'], 'eq', 'info_meta_'))->fetchSql(true)->select();
  120.                 array_push($defaults['join'],['('.$sql.') tmeta'.$key,'tmeta'.$key.'.info_id = info.info_id']);
  121.             }
  122.         }
  123.         //limit偏移
  124.         //分页处理
  125.         if(!$args['paginate']){
  126.             if($defaults['paginate'] = DcPageFilter($args)){
  127.                 unset($args['limit']);
  128.                 unset($args['page']);
  129.             }
  130.         }
  131.         //过滤参数
  132.         foreach(['search','id','title','name','slug','excerpt','password','parent','user_id',
  133.         'create_time','update_time','views','hits','type','mime_type','status','module','controll','action'] as $key=>$where){
  134.             unset($args[$key]);
  135.         }
  136.         //合并参数
  137.         $defaults = DcArrayArgs($args, $defaults);
  138.         dump($defaults);
  139.         $result = DcDbSelect('common/Info', $defaults);
  140.         dump($result);
  141.         //dump(DcArrayResult($result));
  142.     }
  143. }
复制代码


回复

使用道具 举报

淡笑 发表于 2023-6-14 09:21:38 | 显示全部楼层
这是优化数据库的插件吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

QQ|Archiver|手机版|小黑屋|信息共享网

GMT+8, 2024-5-14 05:36 , Processed in 0.074068 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表