长时间潜伏,第一个问题!
我正在努力优化此查询,该查询选择与所选过滤器匹配的价格最低的商品:
SELECT product_info.*, MIN(product_all.sale_price) as sale_price, product_all.buy_link
FROM product_info
NATURAL JOIN (SELECT * FROM product_all WHERE product_all.date = '2010-09-30') as product_all
WHERE (product_info.category = 2
AND product_info.gender = 'W' )
GROUP BY product_all.prod_id
ORDER BY MIN(product_all.sale_price) ASC LIMIT 13
Run Code Online (Sandbox Code Playgroud)
它解释说:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | …Run Code Online (Sandbox Code Playgroud) 我现在正在当前的Rails3项目中编写一个导出器.此导出器必须将每个导出的记录标记为"已导出"(bool).我知道如何在一个循环中轻松地做到这一点,但老实说,让Rails查询数据库,比如连续300次,只是在300条记录上设置一个字段感觉不太好.
有谁知道是否有一个很好的方法来优化这个?我应该使用准备好的语句手动播放,还是Rails3自动处理?是否有另一个SQL命令可以在一个步骤中执行此操作?
谢谢你的帮助
optimization activerecord ruby-on-rails query-optimization ruby-on-rails-3
Oracle SQL Developer v3的SQL Tuning Advisor为我的查询建议如下:
考虑运行Access Advisor以改进物理架构设计或创建建议的索引. 如果您选择创建推荐索引,请考虑删除索引 " SCHEMANAME "." INDEXNAME "(在"COLUMN1"上),因为它是推荐索引的前缀.
create index SCHEMANAME.NEW_INDEXNAME on SCHEMANAME.TABLENAME("COLUMN1","COLUMN2");
是否有任何伤害不是在做大胆的建议?问题是它建议丢弃的现有索引被其他程序使用.我不认为这些因素会相互"伤害",是否有任何缺点让两个索引与它们将占用的磁盘空间分开,并且在插入/更新时性能下降不明显?
是否有任何软件可以分析mySQL查询,并建议特定的索引创建.
我知道最好手工完成它,但我需要能够节省一些时间的东西.
非常感谢,
我有两个表,一个用于位置的值,我正在尝试插入位置.表格已简化为以下内容:
CREATE TABLE value(
Timestamp DATETIME2,
Value float NOT NULL,
PRIMARY KEY(Timestamp)
);
CREATE TABLE location(
Timestamp DATETIME2,
Position INT NOT NULL,
PRIMARY KEY(Timestamp)
);
INSERT INTO value VALUES
('2011/12/1 16:55:01', 1),
('2011/12/1 16:55:02', 5),
('2011/12/1 16:55:05', 10),
('2011/12/1 16:55:08', 6);
INSERT INTO location VALUES
('2011/12/1 16:55:00', 0),
('2011/12/1 16:55:05', 10),
('2011/12/1 16:55:10', 5)
Run Code Online (Sandbox Code Playgroud)
预期的结果将是
TimeStamp, Value, LowerTime, LowerLocation, UpperTime, UpperLocation
2011-12-01 16:55:01, 1, 2011-12-01 16:55:00, 0, 2011-12-01 16:55:05, 10
2011-12-01 16:55:02, 5, 2011-12-01 16:55:00, 0, 2011-12-01 16:55:05, 10
2011-12-01 …Run Code Online (Sandbox Code Playgroud) sql sql-server optimization query-optimization sql-server-2008-r2
所以我在mongoDB中有一个超级简单的数据库,有一些集合:
> show collections
Aggregates <-- count: 92
Users <-- count: 68222
Pages <-- count: 1728288847, about 1.1TB
system.indexes
Run Code Online (Sandbox Code Playgroud)
该Aggregates集合是集合的Pages集合,每个文档如下所示:
> db.Aggregates.findOne()
{
"_id" : ObjectId("50f237126ba71610eab3aaa5"),
"daily_total_pages" : 16929799,
"day" : 21,
"month" : 9,
"year" : 2011
}
Run Code Online (Sandbox Code Playgroud)
非常简单.但是,让我们daily page loads一起添加所有92天来尝试获取总页面加载:
>>> def get_total():
... start = datetime.now()
... print sum([x['daily_total_pages'] for x in c.Aggregates.find()])
... end = datetime.now()
... print (end-start).seconds
...
>>> get_total()
1728288847
43
Run Code Online (Sandbox Code Playgroud)
43秒?!??!??!?!
那92个总结果很小!我不妨将它们存储在一个文本文件中,这很疯狂.
还是他们很小?根据mongo,它们在磁盘上有多大?
> db.Aggregates.stats()
{ …Run Code Online (Sandbox Code Playgroud) 我有一张包含2百万个寄存器的表,但它会很快增长.基本上,该表包含具有相应描述符的图像的兴趣点.当我尝试执行选择空间上接近查询点的点的查询时,总执行时间会花费太长时间.更确切地说,持续时间/提取= 0.484秒/ 27.441秒.查询非常简单,只返回约17000行.
我的查询是:
SELECT fp.fingerprint_id, fp.coord_x, fp.coord_y, fp.angle,
fp.desc1, fp.desc2, fp.desc3, fp.desc4, fp.desc5, fp.desc6, fp.desc7, fp.desc8, fp.desc9, fp.desc10,
fp.desc11, fp.desc12, fp.desc13, fp.desc14, fp.desc15, fp.desc16, fp.desc17, fp.desc18, fp.desc19,
fp.desc20, fp.desc21, fp.desc22, fp.desc23, fp.desc24, fp.desc25, fp.desc26, fp.desc27, fp.desc28,
fp.desc29, fp.desc30, fp.desc31, fp.desc32
FROM fingerprint fp
WHERE
fp.is_strong_point = 1 AND
(coord_x BETWEEN 193-40 AND 193+40) AND (coord_y BETWEEN 49-15 AND 49+15 )
LIMIT 1,1000000;
Run Code Online (Sandbox Code Playgroud)
这就是我所做的.
key_buffer_size的my.ini,但没有看到太大的变化.我如何减少获取时间?是否可以将其减少到毫秒?
我有一个非常大的表,包含IP地址的整数表示,第二个表包含IP地址的整数表示的起始和结束范围.第二个表用于按照几个stackoverflow文章返回国家/地区.虽然这会返回所需的结果,但性能相当差.加入一个范围是否有更高性能的替代方案?下面是一组示例代码,显示了当前连接的工作方式:
CREATE TABLE #BaseTable
( SomeIntegerValue INT PRIMARY KEY);
INSERT INTO #BaseTable (SomeIntegerValue)
SELECT SomeIntegerValue
FROM (VALUES
(123), (456), (789)) Data (SomeIntegerValue);
CREATE TABLE #RangeLookupTable
( RangeStartValue INT PRIMARY KEY
, RangeEndValue INT NOT NULL);
INSERT INTO #RangeLookupTable (RangeStartValue, RangeEndValue)
SELECT RangeStartValue, RangeEndValue
FROM (VALUES
(0, 100), (101, 200), (201, 300)
, (301, 400), (401, 500), (501, 600)
, (701, 800), (901, 1000)) Data (RangeStartValue, RangeEndValue);
SELECT *
FROM #BaseTable bt
JOIN #RangeLookupTable rlt
ON bt.SomeIntegerValue BETWEEN rlt.RangeStartValue …Run Code Online (Sandbox Code Playgroud) 我想从选择记录'2013-04-01 00:00:00'到'today',但是,每一天都有很多的价值,因为他们节省每次15分钟的值,所以我想只能从每天的第一个或最后一个值.
表模式:
CREATE TABLE IF NOT EXISTS `value_magnitudes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`value` float DEFAULT NULL,
`magnitude_id` int(11) DEFAULT NULL,
`sdi_belongs_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`reading_date` datetime DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1118402 ;
Run Code Online (Sandbox Code Playgroud)
错误的SQL:
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` BETWEEN '2013-04-01 00:00:00' AND '2013-04-02 00:00:00' AND (`value_magnitudes`.magnitude_id = 234) LIMIT 1
SELECT value FROM `value_magnitudes` WHERE `value_magnitudes`.`reading_date` …Run Code Online (Sandbox Code Playgroud) 表a_table有索引string_column.
我有一个问题:
SELECT * FROM a_table WHERE string_column = 10;
Run Code Online (Sandbox Code Playgroud)
我曾经EXPLAIN发现没有使用索引.
为什么?你能帮我解决MySQL文档链接吗?
mysql ×5
sql ×5
indexing ×3
optimization ×3
database ×2
sql-server ×2
activerecord ×1
mongodb ×1
oracle ×1
performance ×1
php ×1
pymongo ×1
t-sql ×1