Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 此表及其查询的最佳优化是什么?_Mysql_Indexing_Query Optimization - Fatal编程技术网

Mysql 此表及其查询的最佳优化是什么?

Mysql 此表及其查询的最佳优化是什么?,mysql,indexing,query-optimization,Mysql,Indexing,Query Optimization,我有这张桌子: CREATE TABLE IF NOT EXISTS `listings` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `type` tinyint(1) NOT NULL DEFAULT '1', `hash` char(32) NOT NULL, `source_id` int(10) unsigned NOT NULL, `link` varchar(255) NOT NULL, `short_l

我有这张桌子:

CREATE TABLE IF NOT EXISTS `listings` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` tinyint(1) NOT NULL DEFAULT '1',
  `hash` char(32) NOT NULL,
  `source_id` int(10) unsigned NOT NULL,
  `link` varchar(255) NOT NULL,
  `short_link` varchar(255) NOT NULL,
  `cat_id` mediumint(5) NOT NULL,
  `title` mediumtext NOT NULL,
  `description` mediumtext,
  `content` mediumtext,
  `images` mediumtext,
  `videos` mediumtext,
  `views` int(10) NOT NULL,
  `comments` int(11) NOT NULL DEFAULT '0',
  `comments_update` int(11) NOT NULL DEFAULT '0',
  `editor_id` int(11) NOT NULL DEFAULT '0',
  `auther_name` varchar(255) DEFAULT NULL,
  `createdby_id` int(10) NOT NULL,
  `createdon` int(20) NOT NULL,
  `editedby_id` int(10) NOT NULL,
  `editedon` int(20) NOT NULL,
  `deleted` tinyint(1) NOT NULL,
  `deletedon` int(20) NOT NULL,
  `deletedby_id` int(10) NOT NULL,
  `deletedfor` varchar(255) NOT NULL,
  `published` tinyint(1) NOT NULL DEFAULT '1',
  `publishedon` int(20) NOT NULL,
  `publishedby_id` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `hash` (`hash`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT AUTO_INCREMENT=91628 ;
还有一些像这样糟糕的问题

SELECT  id,type , source_id, link, short_link, cat_id, title,
        description, images, views, comments, published, publishedon,
        content, comments_update, editor_id, auther_name, createdby_id,
        createdon, editedby_id, editedon, deleted, deletedon,
        deletedby_id, deletedfor, publishedby_id
    FROM  listings
    WHERE  (cat_id IN ( 98 ))
      AND  (TYPE IN ('1'))
      AND  (source_id IN ('78'))AND (FROM_UNIXTIME( publishedon ) >= SUBDATE( NOW( ) ,
                        1 )
           )
      AND  (deleted =0)
      AND  (published =1)
    ORDER BY  `publishedon` DESC
    LIMIT  10 OFFSET 0 

需要0.0004秒才能完成,因为它取决于pk的索引

如何为第一个查询中的列建立索引

很多时候,当我使用“ShowProcessList”时,我看到“等待表级锁”和“排序数据”太多了


应用程序始终插入/更新许多行;如何解决这个问题?

您的查询基本上是:

SELECT . . .
FROM listings l
WHERE cat_id = 98 AND
      TYPE = 1 AND
      source_id = 78 AND
      deleted = 0 AND
      published = 1 AND
      FROM_UNIXTIME( publishedon ) >= SUBDATE( NOW( ) , 1 )
ORDER BY `publishedon` DESC
LIMIT 10
OFFSET 0 
为了提高性能,请从
(cat\u id、type、source\u id、deleted、published、publishedon)
上的复合索引开始。语法是:

create index idx_listings_6 on listings(cat_id, type, source_id, deleted, published, publishedon desc);
接下来,我建议将
where
子句改写为:

SELECT . . .
FROM listings l
WHERE cat_id = 98 AND
      TYPE = 1 AND
      source_id = 78 AND
      deleted = 0 AND
      published = 1 AND
      publishedon >= UNIX_TIMESTAMP(SUBDATE( NOW( ) , 1 ))
ORDER BY `publishedon` DESC
LIMIT 10
OFFSET 0 

并使用上面相同的索引。

MySQL不能将索引声明为
DESC
;它忽略该关键字并构建一个
ASC
索引。但是,
orderbyxdesc
仍然可以优化

MySQL在每次选择时只使用一个索引。(通常)

最佳索引从任何带有“=”的
WHERE
子句字段开始

问题1:已经讨论过了

查询2:
索引(已删除、已发布、已发布)

查询3:
索引(类别id,id)

查询4:将
COUNT(id)
更改为
COUNT(*)
,并添加
索引(cat\u id,publishedon)
和/或
索引(publishedon,cat\u id)
。目前还不清楚哪个指数更好。添加这两个选项,让优化器决定。与您的另一个问题一样,按范围划分(publishedon)和使用
索引(cat_id,publishedon)
(而不是另一个)可能是有益的


考虑切换到InnoDB。

SELECT语句不可读;WHERE中的条件子句不应分散在这么多行上,但顶部的select列表应分散在几行上,以便无需水平滚动即可读取。这是否会影响执行时间?你的意思是为这些列建立索引吗?使用btree?
ALTER TABLE listings添加索引someIndexName(cat_id,type,source_id,deleted,published,publishedon)
只有在我通过
publishedon
DESC删除订单时,它才能快速工作,有什么解释吗?@UnixMan。尝试使用第二个版本的查询。我还更改了索引,以便
publishedon
在索引中递减。这可能有助于MySQL为
where
order by
使用索引(这是实现最佳性能所必需的)。我可以在列表上创建索引idx\u listings\u 7(目录id、类型、源代码id、已删除、已发布、视图描述)等其他索引吗;并在列表(cat_id、type、id desc)上创建索引idx_listings_6;诸如此类,或者说那是不好的
SELECT *
FROM `listings`
WHERE id = 5455
SELECT . . .
FROM listings l
WHERE cat_id = 98 AND
      TYPE = 1 AND
      source_id = 78 AND
      deleted = 0 AND
      published = 1 AND
      FROM_UNIXTIME( publishedon ) >= SUBDATE( NOW( ) , 1 )
ORDER BY `publishedon` DESC
LIMIT 10
OFFSET 0 
create index idx_listings_6 on listings(cat_id, type, source_id, deleted, published, publishedon desc);
SELECT . . .
FROM listings l
WHERE cat_id = 98 AND
      TYPE = 1 AND
      source_id = 78 AND
      deleted = 0 AND
      published = 1 AND
      publishedon >= UNIX_TIMESTAMP(SUBDATE( NOW( ) , 1 ))
ORDER BY `publishedon` DESC
LIMIT 10
OFFSET 0