Questions tagged «mysql»

MySQL的所有版本(不是Microsoft SQL Server)。如果与此问题相关,还请添加特定于版本的标记,例如mysql-5.7。

1
启用“ log_queries_not_using_indexes”会禁用“ long_query_time”吗?
我注意到,在MySQL中实现的时候log_queries_not_using_indexes,slow_query_log和long_query_time,生成慢查询日志文件将包含大量的查询即使查询时间比少得多long_query_time。 似乎一旦log_queries_not_using_indexes启用,无论“ long_query_time”是什么,Mysql都会记录所有不使用索引的查询。 有办法克服吗?我的意思是,有没有一种方法可以记录所有比花费更多时间的查询long_query_time,而不管它们是否使用索引?

1
在复制环境中删除bin日志
我有一个关于在复制环境中删除二进制日志的问题: 我们有一个具有1个主设备和2个从设备的环境(运行mysql 5.5)。有时,在繁重的处理时间中,我们遇到了空间问题,因此bin日志目录已满。日志每3天过期一次。我想知道,是否有理由将所有主机(包括主机和从机)上的日志保存3天?例如,将日志在主服务器上保留3天,在从属服务器上保留1天是否有意义?最好的方法是什么? 谢谢!

2
在UPDATE之后触发UPDATE吗?
我想触发一个将任何更新时间记录为: CREATE TRIGGER col_update AFTER UPDATE ON col FOR EACH ROW BEGIN UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id END 问题在于,当此触发器尝试更新updated列时,它也是另一个运行触发器的更新事件。这将创建一个无限循环,该循环将不起作用。 如何将更新时间存储在相应的列中? 我希望使用触发器,因为表中有很多列。如果尝试手动设置更新时间,则需要修改许多查询。

2
为什么MySQL在磁盘上创建了这么多临时表?
任何配置错误都能导致mysql..mysql调谐器显示创建过多的临时表吗 Current max_heap_table_size = 200 M Current tmp_table_size = 200 M Of 17158 temp tables, 30% were created on disk table_open_cache = 125 tables table_definition_cache = 256 tables You have a total of 97 tables You have 125 open tables. Current table_cache hit rate is 3% 较早的临时表是“在23725个临时表中,有38%是在磁盘上创建的”,但我将max_heap和tmp_table从16m更改为200m,并将其降低到30%。 组态: engine myisam …
13 mysql  innodb  myisam  memory 

2
如何从InnoDB表中删除碎片?
我有一个具有表数量的数据库。 我想从表中删除一些记录,说记录数超过20K或50K。 所有的表都是InnoDB。而且file_per_table是关闭。 当我从多个表中删除记录时,表中会出现碎片。 有什么方法可以消除碎片吗? 4月17日更新 mysql> select TABLE_NAME, TABLE_SCHEMA, Data_free from information_schema.TABLES where TABLE_SCHEMA NOT IN ('information_schema', 'mysql') and Data_Free >0; +-----------------+--------------+-----------+ | TABLE_NAME | TABLE_SCHEMA | Data_free | +-----------------+--------------+-----------+ | City | world_innodb | 5242880 | | City_Copy | world_innodb | 5242880 | | Country | world_innodb | …

4
mysql int vs varchar作为主键(InnoDB存储引擎?
我正在构建一个Web应用程序(项目管理系统),并且在性能方面一直想知道这一点。 我有一个Issues表,里面有12个外键链接到其他各种表。在其中的8个中,我需要加入才能从其他表中获取title字段,以便使记录在Web应用程序中有意义,但是,这意味着进行8个加入似乎非常繁琐,尤其是因为我只是在拉入这些联接中的每个联接都有1个字段。 现在,出于永久性的原因,我还被告知要使用自动递增的主键(除非考虑到分片,在这种情况下我应该使用GUID),但是在性能上使用varchar(最大长度为32)有多糟糕?我的意思是,这些表中的大多数可能不会有很多记录(其中大多数应该在20以下)。另外,如果我使用标题作为主键,则不必在95%的时间内进行联接,因此对于95%的sql,我什至会发生任何性能下降(我认为)。我唯一能想到的缺点是我将拥有更高的磁盘空间使用率(但是一天下来确实是一件大事)。 我将查找表用于很多此类而不是枚举的原因是因为我需要最终用户可以通过应用程序本身配置所有这些值。 将varchar用作不包含很多记录的表的主键有什么弊端? 更新-一些测试 因此,我决定对此做一些基本测试。我有100000条记录,这些是基本查询: 基本VARCHAR FK查询 SELECT i.id, i.key, i.title, i.reporterUserUsername, i.assignedUserUsername, i.projectTitle, i.ProjectComponentTitle, i.affectedProjectVersionTitle, i.originalFixedProjectVersionTitle, i.fixedProjectVersionTitle, i.durationEstimate, i.storyPoints, i.dueDate, i.issueSecurityLevelId, i.creatorUserUsername, i.createdTimestamp, i.updatedTimestamp, i.issueTypeId, i.issueStatusId FROM ProjectManagement.Issues i 基本INT FK查询 SELECT i.id, i.key, i.title, ru.username as reporterUserUsername, au.username as assignedUserUsername, p.title as projectTitle, pc.title as ProjectComponentTitle, …

4
InnoDB行锁定-如何实现
我一直在四处逛逛,阅读mysql站点,但仍然看不到它是如何工作的。 我想选择结果并对其行锁定以进行写入,写入更改并释放锁定。audocommit已开启。 方案 id (int) name (varchar50) status (enum 'pending', 'working', 'complete') created (datetime) updated (datetime) 选择状态为待定的项目,然后将其更新为工作状态。使用排他性写入来确保同一物品不会被拾取两次。 所以; "SELECT id FROM `items` WHERE `status`='pending' LIMIT 1 FOR WRITE" 从结果中获取ID "UPDATE `items` SET `status`='working', `updated`=NOW() WHERE `id`=<selected id> 我是否需要做任何事情来释放锁,它是否像我上面所做的那样工作?
13 mysql  innodb  locking 

2
重新设计数据库的机会:用于此传感器数据收集的表格设计如何?
背景 我有一个大约2000个传感器的网络,每个传感器都有大约100个数据点,我们每隔10分钟收集一次。这些数据点通常是int值,但有些是字符串和浮点数。此数据应存储90天,如果可能的话,还可以保留更长时间。 数据库设计 当最初负责该项目时,我编写了一个C#应用程序,该程序为每个传感器编写了逗号分隔的文件。当时没有那么多,当有人想查看趋势时,我们将在Excel中打开csv并根据需要绘制图形。 事情发展了,我们切换到了MySQL数据库。我为每个传感器创建了一个表格(是的,我知道很多表格!);它一直运行良好,但是有一些局限性。拥有如此多的表,显然不可能编写查询来查找特定值时在所有传感器中查找数据的查询。 对于下一个版本,我切换到Microsoft SQL Server Express,并将所有传感器数据放入一个大表中。这也有效,并且让我们进行查询以在所有感兴趣的传感器中查找值。但是,我遇到了Express版本的10GB限制,因此决定改回MySQL,而不是投资于SQL Server Standard。 问题 我对MySQL的性能和可伸缩性感到满意,但不确定是否坚持采用“一个表中的所有数据”方法是最好的。一张桌子上的10GB似乎要求使用其他设计。我应该提到仍然需要查询图形数据,而且我担心查询图形时会出现性能问题,例如,整个90天中一个传感器的温度数据。(换句话说,图形应该是可以快速生成的图形,而不必等待SQL对大量数据进行排序以隔离感兴趣的传感器。) 是否应该以某种方式拆分此表以提高性能?拥有这么大的桌子不是很平常吗? 我在Sensor ID和Timestamp列上都有索引,这几乎是任何查询的定义边界。(即从时间A到时间B获取传感器X的数据)。 我已经阅读了一些有关分片和分区的知识,但是在这种情况下,觉得不合适。 编辑: 根据到目前为止的评论和答案,一些其他信息可能会有所帮助: 不定期存储:目前,我不存储90天以上的数据。每天,我都会运行一个查询,以删除90天以上的数据。如果将来它变得很重要,我会存储更多,但现在就足够了。这有助于保持大小和性能更高。 引擎类型:原始的MySQL实现使用MyISAM。这次为新实现创建表时(一个数据表而不是多个数据表),它们默认为InnoDB。我不认为我需要其中之一。 标准化:当然,除了数据收集表外,还有其他表。这些支持表存储诸如传感器的网络信息,用户的登录信息等内容。据我所知,没有太多要标准化的东西。数据表具有如此多列的原因是每个传感器都有很多变量。(多个温度,光照水平,气压等)。对我进行归一化意味着没有冗余数据或重复的组。(至少对于1NF。)对于给定的传感器,在特定时间存储所有值需要一行数据,并且其中不涉及1:N关系(我知道)。 我可以在功能上分解表,例如在一个表中创建所有与温度相关的值,在另一个表中创建与气压相关的所有值。虽然这可能会提高仅进行温度查询的人员的效率,但我仍然必须一次插入所有数据。尽管如此,效率提高对于SELECT操作还是值得的。显然,最好根据用户请求数据的频率垂直拆分表。也许这就是我应该做的。我想在问我一个问题时正在寻求确认,这样做是值得的。 编辑2: 数据使用:最终,绝不会查看或需要很多数据,因为我们通常只关注有问题的项目。但是,在尝试发现问题时,我们使用各种工具来搜索数据并确定要放大的项目。 例如,我们注意到内存使用率值(特定于客户的专有软件程序)与重启/崩溃之间的相关性。我收集的数据点之一与此内存使用情况有关,并且我能够查看历史数据以显示超出特定内存使用量后设备变得不稳定。今天,对于运行该软件的部分设备,我检查了该值,如果该值过高,则发出重新启动命令。在发现这一点之前,我认为收集这些数据没有价值。 因此,我坚持要收集并存储大约100个数据点,即使该值值得怀疑。但是在正常的日常使用中,用户通常会检查其中的十几个参数。如果用户对特定地理区域感兴趣,则他(可以使用软件)可能会为几十个传感器生成数据的图形或电子表格。查看30天的图表并显示两条或三条显示温度,气压和光照水平等曲线的情况并不少见。这样做将运行类似于以下的查询: SELECT sensor_id, location, data_timestamp, temp1, air1, light1 FROM data WHERE data_timestamp >= '2012-02-01' AND sensor_id IN (1, 2, 3); (在原始的MySQL版本中,每个传感器都有自己的表,将发出三个单独的查询,但结果将通过软件合并以创建图形。) 由于该data表包含很多行(〜1000万),尽管在id和上都有索引data_timestamp,所以性能明显比多表方案(9秒内返回4500行,而在此示例中不到1秒)要好。在多表模式中,找到哪些传感器满足特定条件的能力实际上为零,因此,移至单个表的原因。 这类查询可以由多个用户快速连续地完成,因为他们选择了不同的数据组并比较每个结果中的图形。每个图形或电子表格等待近10秒可能会令人沮丧。 90天后数据将被丢弃。可以将其存档,但当前不是必需的。 …


3
设计比赛数据库的最佳方法
我正在创建一个网页,用于在即将到来的2012年欧洲杯足球锦标赛的所有比赛中下注。需要一些帮助来确定淘汰赛阶段应采取的方法。 我在下面创建了一个样机,当存储所有“已知”小组赛比赛的结果时,我非常满意。这种设计使检查用户是否正确下注变得非常容易。 但是,存储四分之一决赛和半决赛的最佳方法是什么?这些比赛取决于小组赛的结果。 我想到的一种方法是将所有比赛添加到matches表中,但是在淘汰赛阶段将不同的变量或标识符分配给主队/客队。然后将其他标识符映射到团队的其他表中……这可能有用,但感觉不正确。

1
将表复制到其他数据库名称
我们的质量检查环境具有所有后缀为“ test”的数据库名称。例如,生产中的dbname1在质量检查中将具有对应的dbname1test。(这主要是为了防止prod / qa配置混淆)。 我想将几个表复制到QA中。我不确定如何告诉它说“从那里的dbname1复制到那里的dbname1test” 这有可能吗?

2
如何恢复文件被移动到的InnoDB表
所以我有一个在复制流上安装的测试数据库服务器。顾名思义,优化过程很快就被填补了从属数据目录上的空间。MySQL尽职尽责地只是在等待更多的空间。 该数据目录是仅用作mysql的数据目录的文件系统,因此没有其他可释放的内容。 我有一个4 gig innodb测试表,它不是复制流的一部分,所以我想尝试一些方法来查看它是否可以工作,并且作为测试环境,我不太担心事情出了什么问题。 这是我采取的步骤 弄丢了我要移动的桌子 在其上放置一个读锁(即使没有任何写入,并且不在复制流中) 将.frm和.ibd复制到带有一些备用空间的文件系统中 解锁桌子 删减了该表-释放了足够的空间以使优化完成,复制开始重新进行。 停止奴隶/关闭mysql 将文件从tmp中复制回数据目录 重启mysql .err日志中没有任何显示,一切看起来不错。我连接并使用mydb;并在显示表中查看我正在弄乱的表。但是,如果我尝试 select * from testtable limit 10; 我得到错误 ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist 从目前为止我所知道的,我可以从其他所有表中读取数据,并且复制开始备份而没有任何抱怨。 从这一点上我有什么办法可以恢复?如果需要,我可以从头开始重建它,但是很好奇其他人对该企业的总体看法。关于我采取的一系列步骤,如果没有更完美的结果,是否有任何结果? 如果这不是测试服务器,我不能只是“实时运行”并看看会发生什么?如果我愿意,最好的方法是暂时释放生产从属服务器上的空间?

5
MySQL Workbench的替代品
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 我一直在遇到MySQL Workbench的一些问题,我不确定该问题是否可以解决(即,似乎是一个可能已经浮出水面的旧错误),所以我希望能够找到一个如果我无法使用它,请备份好它。我已经筛选了几种建议的替代方法,例如Navicat(Navicat 并非免费用于商业用途,它只有30天的试用期),但没有一个能够令人满意地满足我当前的要求。 我需要的: 兼容Linux(最好是Linux本地,我正在使用Ubuntu) 能够通过SSH隧道连接到远程数据库 免费和/或开源(我目前没有资金花100美元以上购买产品,无论如何都希望支持一个好的开源项目) 至少与Workbench的界面一样好(这可能是因为我已经习惯了它,但是我喜欢它的界面,非常干净且直观的选项卡式界面;尽管不必相同) 支持MySQL 5+ 虽然很高兴,但我不需要Workbench拥有的额外数据建模内容。我也不需要花哨的GUI东西(查询设计器等)。我真正需要的是一种有序查看数据的方式以及一个编辑查询的地方。 我目前正在检查HeidiSQL,但它使我想起了我在运行Win9x / Win2k,仅通过WINE运行时曾经使用过的东西,曾经使我崩溃,并且总体上感觉笨拙,尽管我确实喜欢它的简单性转储数据库或更改多个表的功能。

2
INSERT是否自动提交?
我们的应用程序向MySQL数据库触发INSERT查询以添加记录。我想知道记录是否自动提交。如果我运行ROLLBACK命令,数据库何时执行回滚?提交后是否可以回滚?
13 mysql  innodb 

3
如何将MySQL日志输出到syslog?
我想使用syslog在Ubuntu(10.04 LTS)上记录MySQL(5.1.41)。我发现了将错误日志输出到syslog的信息。 [mysqld_safe] syslog 但是我想使用syslog记录常规日志和慢查询日志。请告诉我如何写配置文件? 我在参考手册中找不到该怎么做。 http://dev.mysql.com/doc/refman/5.1/en/log-destinations.html
13 mysql  logs 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.