在文献中,SQL查询效率通常以"查询前置"(QPS)来衡量.考虑到我手边有生产数据的数据库,这些措施是如何制定的?有没有MySQL工具可以做到这一点?
这可能是一个愚蠢的问题,但它可能会说明联接如何在内部工作.
假设我有一张大桌子L和一张小桌子S(100K行对100行).
以下两个选项之间的速度方面会有什么不同吗?:
OPTION 1: OPTION 2:
--------- ---------
SELECT * SELECT *
FROM L INNER JOIN S FROM S INNER JOIN L
ON L.id = S.id; ON L.id = S.id;
Run Code Online (Sandbox Code Playgroud)
请注意,唯一的区别是表的连接顺序.
我发现不同的SQL语言之间的性能可能会有所不 如果是这样,MySQL将如何与Access进行比较?
我有以下查询:
SELECT
analytics.source AS referrer,
COUNT(analytics.id) AS frequency,
SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094
GROUP BY analytics.source
ORDER BY frequency DESC
LIMIT 10
Run Code Online (Sandbox Code Playgroud)
分析表有60M行,事务表有3M行.
当我EXPLAIN在这个查询上运行时,我得到:
+------+--------------+-----------------+--------+---------------------+-------------------+----------------------+---------------------------+----------+-----------+-------------------------------------------------+
| # id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | |
+------+--------------+-----------------+--------+---------------------+-------------------+----------------------+---------------------------+----------+-----------+-------------------------------------------------+
| '1' | 'SIMPLE' | 'analytics' | 'ref' | 'analytics_user_id | analytics_source' | 'analytics_user_id' …Run Code Online (Sandbox Code Playgroud) 我想知道SQL Server中的价格字段对于类似商店的结构的最佳类型是什么?
看看这个概述,我们有数据类型称为money,smallmoney,然后我们有十进制/数字,最后浮动和真实.
名称,内存/磁盘使用情况和值范围:
将价格值存储在这些类型中真的很明智吗?那怎么样.INT?
让我们说一家商店使用美元,他们有美分,但我认为价格不是49.2142342所以使用大量小数显示美分似乎浪费了SQL带宽.其次,大多数商店不会显示200.000.000附近的任何价格(至少在正常的网上商店,除非有人试图在巴黎卖给我一座着名的塔)
那么为什么不去找一个int?
一个int很快,它只有4个字节,你可以很容易地产生小数,通过以美分而不是美元保存值然后在你呈现值时除以.
另一种方法是使用4个字节的smallmoney,但这需要CPU的数学部分来进行计算,其中Int是整数幂......在缺点上你需要划分每个结果.
使用smallmoney/money字段时,区域设置是否存在"货币"相关问题?这些在C#/ .NET中也会转移什么?
任何利弊?去整数价格或小钱币或其他?
你的经验告诉我什么?
c# sql-server database-design query-optimization linq-to-sql
说我有一个表order作为
id | clientid | type | amount | itemid | date
---|----------|------|--------|--------|-----------
23 | 258 | B | 150 | 14 | 2012-04-03
24 | 258 | S | 69 | 14 | 2012-04-03
25 | 301 | S | 10 | 20 | 2012-04-03
26 | 327 | B | 54 | 156 | 2012-04-04
Run Code Online (Sandbox Code Playgroud)
clientid是一个回到client桌面的外键itemid是一个回到item表的外键type只是B或Samount 是一个整数和一张桌子processed作为
id | orderid …Run Code Online (Sandbox Code Playgroud) 以下是我的查询.我试图让它使用索引扫描,但它只会seq扫描.
顺便说一下,这个metric_data表有1.3亿行.该metrics表有大约2000行.
metric_data 表格列:
metric_id integer
, t timestamp
, d double precision
, PRIMARY KEY (metric_id, t)
Run Code Online (Sandbox Code Playgroud)
如何让此查询使用我的PRIMARY KEY索引?
SELECT
S.metric,
D.t,
D.d
FROM metric_data D
INNER JOIN metrics S
ON S.id = D.metric_id
WHERE S.NAME = ANY (ARRAY ['cpu', 'mem'])
AND D.t BETWEEN '2012-02-05 00:00:00'::TIMESTAMP
AND '2012-05-05 00:00:00'::TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)
说明:
Hash Join (cost=271.30..3866384.25 rows=294973 width=25)
Hash Cond: (d.metric_id = s.id)
-> Seq Scan on metric_data d (cost=0.00..3753150.28 rows=29336784 width=20)
Filter: ((t >= '2012-02-05 00:00:00'::timestamp without …Run Code Online (Sandbox Code Playgroud) postgresql indexing query-optimization postgresql-9.1 postgresql-performance
我datetime在一个非常大的表中有一个SQL 字段.它已编入索引,需要进行查询.
问题是SQL总是存储时间组件(即使它始终是午夜),但搜索是在当天而不是时间.
declare @dateVar datetime = '2013-03-11;
select t.[DateColumn]
from MyTable t
where t.[DateColumn] = dateVar;
Run Code Online (Sandbox Code Playgroud)
不会返回任何内容,因为它t.[DateColumn]总是包含一个时间组件.
我的问题是围绕这个最好的方法是什么?
似乎有两组主要选择:
使用dateadd和创建第二个变量并使用between ... and或>= ... and ... <=.
转换t.[DateColumn]为仅限日期的组件 - 我认为这将导致任何索引被忽略.
这两个看起来都非常混乱 - 我真的不想进行范围比较或扫描表格.
有没有更好的办法?
如果其中一个选项始终是最佳方式,那么如何以及为什么?
我正在开发一个可以支持线程注释的Web应用程序.我需要能够根据收到的投票数重新安排评论.(与reddit中的线程注释相同)
我很想听听SO社区对如何做到这一点的意见.
我该如何设计评论表?这是我现在使用的结构:
Comment
id
parent_post
parent_comment
author
points
Run Code Online (Sandbox Code Playgroud)
应该对这个结构做些什么改变?
如何从此表中获取详细信息以正确方式显示它们?(欢迎以任何语言实施.我只想知道如何以最好的方式做到这一点)
在实现此功能时我需要注意哪些事项,以便减少CPU /数据库的负载?
提前致谢.
performance database-design comments table-structure query-optimization
请考虑以下数据库表:
以下查询用于获取一堆消息和相应的用户:
SELECT messages.id, messages.message, users.id, users.username
FROM messages
INNER JOIN users ON messages.user_id=users.id
WHERE messages.id in (?, ?, ?, ? ... a total of 100 "?":s);
Run Code Online (Sandbox Code Playgroud)
在每个查询中提取100条消息.
"messages"的索引是id(主键,BIGINT 不是自动生成的)和user_id.
"users"在id(主键,INT自动生成)上建立索引.
数据库是使用MyISAM的MySQL.
目前查询需要超过3000毫秒才能执行,这使我感到困惑,因为"消息"被索引在"id"上,因此检索正确的行应该非常快.
我的问题是:鉴于描述场景和设置,是一个3000毫秒的查询时间"正常"或我错过了什么?如果需要进一步的详细信息,请告诉我.
更新#1:以下是表定义:
CREATE TABLE messages (
id bigint(20) NOT NULL DEFAULT '0',
user_id int(11) NOT NULL DEFAULT '0',
message varchar(160) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY user_id (user_id),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE users (
id int(11) NOT NULL DEFAULT …Run Code Online (Sandbox Code Playgroud) 我有一张叫做订单的桌子.订单上的一列是customer_id
我有一个名为customers的表,有10个字段
给定两个选项如果我想构建一个订单对象数组并嵌入订单对象是客户对象,我有两个选择.
一个.第一个查询订单表.湾 循环记录并查询人员表以获取该人的记录
这将是这样的:
Select * from APplications
Select * from Customer where id = 1
Select * from Customer where id = 2
Select * from Customer where id = 3
Select * from Customer where id = etc . . .
Run Code Online (Sandbox Code Playgroud)
一个.在所有领域进行联接
它显然是#2,因为你只进行一次查询而不是1 + [numberOforders]查询(可能是数百或更多)
这将是这样的:
Select * from Applications a, Customers c
Innerjoin c.id = a.customerID
Run Code Online (Sandbox Code Playgroud)
我的主要问题是,如果我在订单表中有10个其他表(类似于客户),那么你在订单表中有了id.你应该做一个连接这10个表的单个查询,或者在某个时候这样做是否效率低:
任何建议都会有所帮助..是否有任何优化以确保快速性能
sql ×5
mysql ×3
indexing ×2
performance ×2
postgresql ×2
sql-server ×2
amazon-rds ×1
c# ×1
comments ×1
database ×1
datetime ×1
linq-to-sql ×1
optimization ×1
t-sql ×1