标签: query-optimization

Mysql慢查询:JOIN +多个WHERES + ORDER BY

长时间潜伏,第一个问题!

我正在努力优化此查询,该查询选择与所选过滤器匹配的价格最低的商品:

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)

mysql database indexing query-optimization

7
推荐指数
1
解决办法
1941
查看次数

更新多个记录的单个属性的最佳实践

我现在正在当前的Rails3项目中编写一个导出器.此导出器必须将每个导出的记录标记为"已导出"(bool).我知道如何在一个循环中轻松地做到这一点,但老实说,让Rails查询数据库,比如连续300次,只是在300条记录上设置一个字段感觉不太好.

有谁知道是否有一个很好的方法来优化这个?我应该使用准备好的语句手动播放,还是Rails3自动处理?是否有另一个SQL命令可以在一个步骤中执行此操作?

谢谢你的帮助

  • 阿恩

optimization activerecord ruby-on-rails query-optimization ruby-on-rails-3

7
推荐指数
2
解决办法
4024
查看次数

是否有必要考虑删除现有索引,因为它是推荐索引的前缀

Oracle SQL Developer v3的SQL Tuning Advisor为我的查询建议如下:

考虑运行Access Advisor以改进物理架构设计或创建建议的索引. 如果您选择创建推荐索引,请考虑删除索引 " SCHEMANAME "." INDEXNAME "(在"COLUMN1"上),因为它是推荐索引的前缀.

create index SCHEMANAME.NEW_INDEXNAME on SCHEMANAME.TABLENAME("COLUMN1","COLUMN2");

是否有任何伤害不是在做大胆的建议?问题是它建议丢弃的现有索引被其他程序使用.我不认为这些因素会相互"伤害",是否有任何缺点让两个索引与它们将占用的磁盘空间分开,并且在插入/更新时性能下降不明显?

sql oracle performance query-optimization

7
推荐指数
3
解决办法
1000
查看次数

mySQL索引建议软件

是否有任何软件可以分析mySQL查询,并建议特定的索引创建.

我知道最好手工完成它,但我需要能够节省一些时间的东西.

非常感谢,

mysql sql indexing query-optimization

7
推荐指数
1
解决办法
2244
查看次数

如何有效地选择小于和大于给定值的最近值?

我有两个表,一个用于位置的值,我正在尝试插入位置.表格已简化为以下内容:

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

7
推荐指数
1
解决办法
2万
查看次数

在简单但大型数据库中对小集合进行mongoDB查询的速度非常慢

所以我在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)

database optimization query-optimization mongodb pymongo

7
推荐指数
1
解决办法
9106
查看次数

MySQL获取时间优化

我有一张包含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)

这就是我所做的.

  1. 我试图改变key_buffer_sizemy.ini,但没有看到太大的变化.
  2. 另外我试图将coord_x和coord_y设置为索引,但查询时间变慢了.
  3. 该表由coord_x字段的范围划分,这给了我更好的结果.

我如何减少获取时间?是否可以将其减少到毫秒?

mysql query-optimization database-performance

7
推荐指数
2
解决办法
3万
查看次数

加入价值范围的最优绩效

我有一个非常大的表,包含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)

sql t-sql sql-server query-optimization

7
推荐指数
1
解决办法
1280
查看次数

SQL:如何每天选择一条记录,假设每天包含多于1个值的MySQL

我想从选择记录'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)

php mysql sql query-optimization sql-optimization

7
推荐指数
1
解决办法
9680
查看次数

MySQL:整数值和字符串字段与索引的比较

a_table有索引string_column.
我有一个问题:

SELECT * FROM a_table WHERE string_column = 10;
Run Code Online (Sandbox Code Playgroud)

我曾经EXPLAIN发现没有使用索引.
为什么?你能帮我解决MySQL文档链接吗?

更新:Sandbox(SQL小提琴)

mysql indexing query-optimization

7
推荐指数
1
解决办法
7601
查看次数