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