SQL优化
dbdao吧
全部回复
仅看楼主
level 4
版本:5.6.16 系统:CENTOS 6.5
表结构:
Create Table: CREATE TABLE `api_orders` (
`OrderId` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键,自增长',
`JxOrderRaw` text NOT NULL,
`ChannelOrderRaw` text NOT NULL,
`SyncState` int(11) NOT NULL COMMENT '同步状态 0=默认 1=同步中 ,2=同步结束',
`ChannelId` int(11) NOT NULL,
`IsPaid` tinyint(1) NOT NULL COMMENT '是否已支付 0未支付 1已支付',
`channelOrderId` varchar(50) NOT NULL COMMENT '记录渠道订单ID 或者标识',
`DataState` smallint(3) NOT NULL COMMENT '数据状态0=无状态,1=有效,2=无效(软删除),3=数据有错误',
`CreateTime` datetime DEFAULT NULL,
`UpdateTime` datetime DEFAULT NULL,
`OrderErrType` bigint(11) NOT NULL DEFAULT '1' COMMENT '错误类型',
`OrderErrDesc` varchar(200) DEFAULT NULL COMMENT '错误描述',
PRIMARY KEY (`OrderId`),
KEY `channelOrderId` (`channelOrderId`)
) ENGINE=InnoDB AUTO_INCREMENT=4815089 DEFAULT CHARSET=utf8 COMMENT='接口订单'
SQL语句:
SELECT ao.OrderId, ao.JxOrderRaw,ao.ChannelOrderRaw,ao.SyncState,ao.ChannelId,ao.IsPaid,ao.ChannelOrderId,ao.OrderErrType
FROM api_orders AS ao
WHERE ao.IsPaid =1 AND ao.SyncState NOT IN (1,2) AND ao.DataState=1
ORDER BY ao.`OrderId` ASC
LIMIT 0,100;
执行计划:(平均执行时间3-10S)
给WHERE ao.IsPaid =1 AND ao.SyncState NOT IN (1,2) AND ao.DataState=1 创建组合索引后的执行计划:(平均执行时间0.00)
如果一: ao.IsPaid =1 AND ao.SyncState NOT IN (1,2) AND ao.DataState=1 的值,固定不变,请问创建组合索引没问题吧 ?
如果二:ao.IsPaid =1 AND ao.SyncState NOT IN (1,2) AND ao.DataState=1 的值经常变化的话,创建组合索引会容易产生碎片,后期会可能导致性能问题。
comment状态的值等于1,2,3的时候,一直比较迷惘,请教各位,谢谢!
2016年05月26日 10点05分 1
level 9
ao.IsPaid =1 AND ao.SyncState NOT IN (1,2) AND ao.DataState=1 的值经常变化的话?
怎么个变化?
另外你的图太小了,都不能点进去放大看。
2016年05月26日 10点05分 2
其实挺大的,不能放大就不知道了!变化指的就是现在是等于1,有可能 2或者3,这个的变化。
2016年05月27日 01点05分
level 9
河南-老宋(273002188) 6:57:39 PM
不能因为变化 而不加索引 。
2016年05月26日 11点05分 3
了解。谢谢biot
2016年05月27日 01点05分
1