我有一个包含四列的表,这些列都是不可为空的,并且数据是这样的,需要所有四列来区分唯一记录。这意味着如果我要创建一个主键,它需要包含所有列。对表的查询几乎总是拉回单个记录,即所有列都将在查询中被过滤。
由于需要搜索每一列,拥有主键对我有好处吗(除了强制记录的唯一性)?
我今天在我们的数据库中遇到了一个视图,其中 where 子句中的第一个语句是where 1 = 1. 这不应该对每条记录都返回 true 吗?如果不过滤任何记录,为什么有人会写这个?
我知道两者之间的含义或意图可能有所不同,但是聚集主键和聚集唯一索引之间是否存在任何行为或性能差异?
让我给你一些设置。我们在 MySQL 5.1 上有一个 InnoDB 表,有近 2000 万条记录,没有外键,以及我们所做的查询的适当索引。我们正在为 .NET Entity Framework 使用最新的 6.3.5 MySQL 版本。通常我们习惯于处理 SQL Server 和实体框架,但在这个项目中我们决定尝试一下 MySQL。
我对这个问题有一些理论,但让我先做代码设置
EF LINQ 查询
var failsForAcct1001 = db.Failures.Where(x => x.AccountId == 1001);
/* farther down and later on in the code */
return failsForAcct1001.OrderBy(x => x.FailureId).Take(50);
Run Code Online (Sandbox Code Playgroud)
生成的 MySQL 代码
请忽略列名,它们不是理解问题所必需的
select
External1.FailureId,
External1.col2,
External1.col3,
from (select
Inner1.FailureId,
Inner1.col2,
Inner1.col3,
from Failures Inner1
where External1.AccountId = 1001
) External1
order by External1.FailureId
limit 50
Run Code Online (Sandbox Code Playgroud)
生成的这个 SQL 与 SQL Server 中发生的情况非常相似,SQL 处理它没有问题。这不仅仅是一个实体框架问题,当我接受这个查询并在 MySQL …
曾经有一个指向 9075:2003 的 JTC 1/SC 32 工作草案的公共链接,但自从他们在 2003 年之后的修订版中开始使用以来,我一直没有使用该链接。鉴于有许多其他规范的公开副本(例如 11179-1:2004),我想知道是否有人知道合法访问 ISO/IEC 9075 规范的任何方法。也许有一个指向工作草案的链接,或者一个基金会以不到大约 3000 美元的价格提供对它的访问,我从标准机构学习 SQL 而不是依赖于特定于实现的书籍和文档需要花费我。
我有一个表,可以在一秒钟内从数千次中插入、更新和选择。不过我遇到了死锁问题。
每秒 40 次,还有一个来自该表的选择语句,如果条件为真(95% 的时间为真),则使用类似于以下的代码进行更新:
创建过程 AccessFile (@code, @admin) AS
声明@id int、@access 日期时间、@file 字符串
从代码 = @code 的文件中选择 @id=Id、@accessed = 访问、@file = 文件
IF @admin<> 0 IF @accessed 为空开始
设置事务隔离级别读取未提交
更新文件集访问 = getdate() 其中 id = @id
设置事务隔离级别读取已提交
结尾
选择@id 作为Id,@file 作为文件
似乎是更新与导致死锁的插入冲突。
该示例是一个 1 比 1 的存储过程,唯一的区别是名称。假定为 1 和 2,无论存储过程名称如何。
我们使用的是 PostgreSQL v8.2.3。
涉及的表有:EMPLOYEE和EMAILLIST。
Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)
Run Code Online (Sandbox Code Playgroud)
2 个表以这样的方式连接,如果 EMPLOYEE.EMAIL1 或 EMPLOYEE.EMAIL2 没有匹配的条目,则将返回这些行。
SELECT employee.email1, employee.email2,
e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
FROM employee
LEFT JOIN emaillist e1 ON e1.email = employee.email1
LEFT JOIN emaillist e2 ON e2.email = employee.email2
WHERE e1.email IS NULL OR e2.email IS NULL
Run Code Online (Sandbox Code Playgroud)
列EMAIL是VARCHAR(256)的EMAILLIST表索引。现在,响应时间是 14 秒。
表数统计:目前EMPLOYEE有165,018条记录,EMAILLIST有1,810,228条记录,未来两个表都有望增长。
让我们回顾一下SQL-Server 的dba.exchange Oracle 问题。
这是 SaUce 的代码,经过一些格式化:
CREATE PROCEDURE GetCustomer
@FirstN nvarchar(20) = NULL,
@LastN nvarchar(20) = NULL,
@CUserName nvarchar(10) = NULL,
@CID nvarchar(15) = NULL
as
begin
DECLARE @sql nvarchar(4000)
SELECT @sql = 'C_FirstName, C_LastName, C_UserName, C_UserID
FROM CUSTOMER
WHERE 1=1 '
IF @FirstN IS NOT NULL
SELECT @sql = @sql + ' AND C_FirstName like @FirstN '
IF @LastN IS NOT NULL
SELECT @sql = @sql + ' AND C_LastName like @LastN '
IF @CUserName IS …Run Code Online (Sandbox Code Playgroud) 我最近担任了一个系统管理员职位,负责管理一组 20 台(左右)服务器。我之前没有处理过的一件事(除了在测试情况下)是向 MySQL 复制场引入一个新的从属服务器。
基本上复制设置如下:
MS -> SL1 -> SL2 (backup)
| SL3 (reporting)
SB2 SL4 (loadbalanced web slave)
SL5 (loadbalanced web slave)
SL6 (loadbalanced web slave)
SL7 (loadbalanced web slave)
Run Code Online (Sandbox Code Playgroud)
但基本上它是一个有两个读从站的主站,(一个纯粹用于备份),一个主读从站(主站正在等待,如果你愿意的话),后面有 6 个从站,用于额外的备份,4 个负载均衡的网络读取从站和用于报告的服务器。
我在网上做了很多阅读,并假设向环境中添加一个新的奴隶(来自 SL1),将是:
STOP SLAVE;FLUSH TABLES WITH READ LOCK;UNLOCK TABLES;然后START SLAVE;(到目前为止一切正常,SL2 重新上线并赶上)但是,一段时间后,我从二进制日志中收到重复的键插入错误:
110122 17:01:25 [ERROR] Slave SQL: Error 'Duplicate entry '2011-01-22 17:00:01' …Run Code Online (Sandbox Code Playgroud) 我有一个内存为 2Gb 的 MySql 服务器。什么是最好的配置,然后使用最好的结果?如何将此内存“分配”到 MySql 服务器?
performance ×4
mysql ×3
index ×2
primary-key ×2
deadlock ×1
memory ×1
orm ×1
postgresql ×1
query ×1
replication ×1
sql-server ×1
sql-standard ×1