Questions tagged «mysql»

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

2
不是索引的列是否与索引一起在磁盘上排序?
在MySQL,MyISAM和InnoDB中,不是索引的列是否与索引一起在磁盘上排序? 我开始写一个错误的想法: 我认为可能不会,因为它们没有索引。如果将它们排序,则意味着它们是索引。 这是不正确的,因为每个索引列均按其自身内容的顺序排序,但是我要询问的是每一行(或仅某些列)及其相应索引的排序。 解释一下,我说:这对于使选择行的范围(按索引并排在一起)的速度更快很有用。例如,如果我想select * where id >1000 and id<2000(MySQL语法中可能有错误,我不太了解),那么可以快速从磁盘读取id列本身,因为它的1000到2000的单元可能一起位于物理磁盘上。但是可以将与id 1000到2000对应的其他列内容写入物理磁盘上的不同位置。如果还对它们进行了排序,则读取速度会更快。我认为,也许MySQL会自动对物理磁盘上的该列进行排序,以实现此类操作。 它们是否在其他类型的数据库(PostgreSQL等)中排序? 12月27日:从这两个答案中可以看到,在存在聚集索引/主键的情况下,简单行本身并未在物理磁盘上排序(正如我认为的那样/可能),甚至聚集索引也是没有排序,如果它是b树,我已经阅读了有关b树的信息,并且据我了解,它的节点停留在磁盘上的随机位置。

1
从.zip安装MySQL for Windows并重置root密码
我想在我的PC(使用Windows 8.1 x64)上仅安装MySQL服务器,而没有Workbench或其他工具。所以我.zip从dev.mysql.com/downloads下载了归档文件。它是x86_64版本5.7.9(MySQL Community Server(GPL))上Win64的下载。 我将其安装为Windows服务,但没有mysql数据库information_schema。所以我执行了这个: mysql_upgrade.exe --upgrade-system-tables 并mysql创建了数据库。但是与此同时,root用户也发生了一些事情,因为我无法再访问mysql了。 因此,我决定重设此突然出现的密码(因为在此之前我没有密码)。我在官方手册中建立了以下解决方案,我像这样启动了服务器: mysqld.exe --skip-grant-tables --console 然后我mysql没有密码就打开了: mysql.exe –u root 然后尝试重置根密码: SET PASSWORD FOR 'root'@'localhost' = PASSWORD(‘passhere'); 但是我得到了这个错误: 错误1131(42000):您将MySQL作为匿名用户使用,不允许匿名用户更改密码”。 这是什么?我如何匿名?所有命令均在cmd.exe管理员下执行。 在这种情况下,我应该怎么做才能重置根密码? 更新1:我尝试检查当前用户: SELECT USER(), CURRENT_USER(); 这给出了: +--------+----------------+ | USER() | CURRENT_USER() | +--------+----------------+ | root@ | @ | +--------+----------------+ 太奇怪了,因为我这样开始mysql.exe -u root。 然后我检查了用户表: …

1
十进制或点数据类型,用于在MySQL中存储地理位置数据
我想将每个地址的地理位置存储在我的MySQL(Innodb)“ tblAddress”表中,我想我有2个选项: 1) 2 columns for Each Address: Latitude DECIMAL(10, 8), Longitude DECIMAL(11, 8) 2) One Column for Each Address: GeoLocation POINT 我的程序需要从当前位置(移动客户端)中查找所有落在1公里半径以内的地址。 同样,下面的命令对我不起作用,不确定我需要什么。 CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation); 那么,这里建议使用什么方法来存储数据以便更快地进行计算和检索。请指教。

2
优化MySQL SELECT语句中TIMESTAMP字段的WHERE条件
我正在为一个跟踪使用时间的分析系统设计一个模式,并且需要查看特定日期范围内的总使用时间。 举一个简单的例子,这种查询类型将经常运行: select sum(diff_ms) from writetest_table where time_on > ("2015-07-13 15:11:56"); 在人口众多的表上,此查询通常需要7秒钟左右。它有约3500万行,运行在Amazon RDS(db.m3.xlarge)上的MySQL上的MyISAM。 摆脱WHERE子句可以使查询仅花费4秒,而添加第二个子句(time_off> XXX)则需要增加1.5秒,从而使查询时间达到8.5秒。 因为我知道通常会完成这些类型的查询,所以我想优化一些东西,使其更快,最好在5秒以下。 我从在time_on上添加索引开始,尽管它大大加快了WHERE“ =”查询,但对“>”查询没有影响。有没有一种方法可以创建可以加快WHERE“>”或“ <”查询的索引? 或者,如果还有其他建议可以查询此类查询的性能,请告诉我。 注意:我使用“ diff_ms”字段作为非规范化步骤(它等于time_off-time_on),这将聚合的性能提高了大约30%-40%。 我正在使用以下命令创建索引: ALTER TABLE writetest_table ADD INDEX time_on (time_on) USING BTREE; 在原始查询上运行“ explain”(使用“ time_on>”)时,time_on是“ possible_key”,而select_type是“ SIMPLE”。“额外”列显示“在何处使用”,“类型”为“全部”。添加索引后,该表显示“ time_on”是“ MUL”键类型,由于同一时间可以出现两次,因此这似乎是正确的。 这是表模式: CREATE TABLE `writetest_table` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, …

2
具有更多列的单个表与具有更少列的多个表
对于社交网站,哪种数据库设计更好?具有更多列和更少行的单个表,还是具有更少列但更多行的多个表? 例如:用户可以在自己的墙上或群组中发布更新。 我可以想到的两种数据库设计是: 设计1 用户帖子 ID 用户身份 发布 约会时间 UserGroupPost: ID groupId 用户身份 发布 约会时间 潜在问题:可能需要加入,这可能(将来)成为缓慢的查询。 设计2 帖子: ID 用户身份 groupId 发布 日期时间(如果用户在墙上张贴,则groupid将为null) 潜在问题:循环遍历大型数据集可能需要花费很长时间。 数据增加时如何获得更好的性能?还有其他(更好)的方法吗?

2
查询以根据时间重叠确定开始和结束日期
给定以下数据: id | user_id | started | closed | dead ------------------------------------------------------------------------------------------- 7714 | 238846 | 2015-01-27 15:14:50 | 2015-02-02 14:14:13 | NULL 7882 | 238846 | 2015-01-28 13:25:58 | NULL | 2015-05-15 12:16:07 13190 | 259140 | 2015-03-17 10:11:44 | NULL | 2015-03-18 07:31:57 13192 | 259140 | 2015-03-17 10:12:17 …
8 mysql 

1
MySQL在数字列中加载NULL
MySQL 5.6.23,InnoDB 我正在使用LOAD DATA INFILEcommnd 从字符分隔的文本文件中加载表,我希望每个带有a的字段(在此设置中\N为NULL字符)都将a放置NULL在表中。一些数字类型具有此行为,而另一些数字类型则放置0。我正在使用FIELDS TERMINATED BY,某些列确实可以正确获取NULL值,因此它不是固定行格式的问题。 这些是我在测试时观察到的类型: INT插入NULLs DECIMAL(x,0)插入NULLs DECIMAL(x,y)插入0.0s FLOAT插入0s DOUBLE(x,y)插入0.0s DOUBLE插入0s 所有有问题的列都用定义DEFAULT NULL。我知道各种函数都可以将这些0s转换为NULLs。问题是是否存在可以处理小数精度并且也将NULL在加载时插入s 的数据类型。 此外,我看到了一大堆与误解字符串,空字符串和null值有关的问题。(示例 示例 示例)这不是问题,因为NULLs存在,并且在我将其重新定义为DECIMAL(x,0)时正确地装入了同一列,然后在定义为DECIMAL(x,3)时不正确。

2
有关基础设计,首次数据库设计的建议
我正在学习成为一名Java开发人员的课程。 该课程涉及使用数据库,但是不幸的是,我们从未真正设计任何数据库。 大多数时候,我们会获得预制数据库,并且必须在其上实现代码以插入,更新,读取或删除数据。 但是,当我进行最后的测试时,很可能我会做一些涉及数据库的事情,因此我想尝试设计一些较小的项目以摆脱设计的束缚,因为我注意到良好的数据库设计在编写代码以使用它。 我希望这里允许这些类型的问题,并且不会太广泛。 这是东西简单做了一个小设计,我clubs和members同addresses和phonenumbers。 将有多个俱乐部。 每个俱乐部将有多个成员(明显) 成员不能成为多个俱乐部的成员 成员可以具有多个电话号码和电子邮件地址 会员只能有一个地址 一个地址可以属于不同的成员(夫妇或兄弟姐妹) 我最大的困惑: 如果我想在其中添加Club描述所有者(也将是成员)的列,那么最好是在没有两次列出相同成员的情况下的最佳方法? 我应该将所有表格放在id的自动增量上,还是一个坏主意?(好处/缺点?) 如果在“外键”选项卡中添加外键,这些外键会自动对应于正确的表吗?还是也必须将它们添加到列中?(见图2) 而我在所有可能noobiest问题...我是否把的外键phonenumber并email在各自的表链接到一个PERSON_ID或者我应该把phoneNumber的和电子邮件标识的在人的表? (我对图片中的语言不是英语表示歉意,希望这不是太大的问题)

1
mydumper的“ --use-savepoints”选项如何减少元数据锁定
MyDumper 0.6.1添加一个新选项--use-savepoints。从手册中,它意味着: 使用保存点减少元数据锁定问题,需要SUPER特权 我不明白 它如何“减少元数据锁定问题”,为什么它需要“超级权限”?我认为,元数据对于防止其他DDL修改表结构至关重要。

7
远程MySQL连接失败(10060)-“无法连接到domainname.com上的MySQL服务器(10060)”
我已经在VB6中开发了一个应用程序,并且正在使用在线MySQL数据库服务器来存储我的应用程序数据。 第一次尝试连接数据库服务器成功,但是在关闭应用程序并再次启动后,我得到: 无法连接到MySQL服务器(10060)” 一段时间(大约30分钟)后,我可以再次成功连接到数据库。 我已经为所有MySQL系统和全局变量(例如connection_timeout,wait_timeout等)赋予了最大值。 我已将所有权限授予MySQL用户。 我的计算机上的防火墙已关闭。 当应用程序关闭时,所有连接均正确关闭。 我问了提供在线MySQL数据库服务的技术人员,他们给了我以下三个原因: 您尝试连接的本地计算机未在服务器上列入白名单。 已超过用户的最大连接数。 当时,MySQL服务器已关闭(尽管他们说自己的服务器没有关闭)。 我该如何解决前两个原因,或者确定它们是问题的原因?还是可能还有另一个未列出的问题?

1
MySQL复制:落后于Master的秒数超高
我已经为生产数据库设置了一个从属db服务器,但是当我检查show slave的状态时,我发现它比master落后几秒钟。 这是输出: Slave_IO_State: Waiting for master to send event Master_Host: 1.2.3.4 Master_User: replicator Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000173 Read_Master_Log_Pos: 15909435 Relay_Log_File: mysqld-relay-bin.000079 Relay_Log_Pos: 91173356 Relay_Master_Log_File: mysql-bin.000093 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 91173210 Relay_Log_Space: 8179978166 Until_Condition: None Until_Log_File: …

1
两台服务器中MySQL性能的巨大差异
我们有一个安装在两台不同机器上的MySQL服务器,分别是测试服务器和生产服务器,这两个窗口都是Web应用程序使用的窗口。 问题在于,执行某些查询时,两台计算机之间存在巨大的性能差异(生产服务器是速度较慢的服务器)。两台服务器中的MySQL版本相同,甚至配置文件也相同(唯一的区别是数据的路径以及生产服务器除了错误外不记录任何东西)。我所说的性能差异要大3或4个数量级(例如,测试服务器中的查询执行时间为0.2 s,而生产服务器中的查询执行时间为84 s)。 令人讨厌的查询大量使用了带有“ WHERE [...] IN [...]”的子句,据我所知,它们通常非常慢,应将其替换为JOIN。但是,我们使用的MySQL版本是5.6.19,它会自动优化那些查询,这就是为什么它们在测试服务器中能快速执行的原因(而且它们属于程序的一部分,我们无法更改,因此我们无法手动对其进行优化)无论如何)。 就像我说的那样,MySQL的安装和配置是相同的,因此对于问题可能出在哪里我一无所知。一方面,我怀疑这一定是某种配置问题,因为程序和DB相同,另一方面,由于配置相同,所以这没有意义。 服务器上的一些数据: 测试服务器: 英特尔酷睿2四核Q9400 @ 2.66GHz 8GB RAM Windows Server 2008 R2标准 生产服务器: 英特尔至强E5530 @ 2.40GHz 5GB RAM Windows Server 2012 R2标准 编辑:我忘了说一件重要的事情:还有更多的查询正在执行,这些查询使用“ WHERE ... IN”子句作为“违规”子句。它们在两台计算机上都可以快速执行,这表明我已经通过MySQL对其进行了优化。如果这是实际问题(我不确定),那么对某些查询进行优化(而不对其他查询进行优化)的事实对我来说是个谜。 编辑#2:这是两个服务器的配置文件:http : //pastebin.ca/2834906 编辑#3:这是慢速查询之一的解释:https ://mariadb.org/ea/v36zj EXPLAIN在测试和产品中完全相同。查询本身在这里:http : //pastebin.com/VXgBxXmt它已经使用自动格式化程序进行了格式化,因此可能不是很清楚。如您所见,它相当长且复杂。它不是手动生成的,而是由软件自动生成的,该软件使用标准SQL的方言和某些功能。 另外,更多信息:我们通过减少生产服务器中的数据并删除了数据库中将不使用的大多数旧数据来临时修补了该问题。当然,这不是解决方案,因为我们还需要旧数据,将来会成为问题。DB并不是那么大:完整的DB为1308MB,目前正在生产的精简版本为332MB。 更新:已解决? 我想我已经解决了问题。由于尚未使用生产服务器,因此我尚未对其进行测试,但是可能的问题是参数“ innodb_buffer_pool_size”,该参数设置为182M。实际上,配置文件中的行显示:innodb_buffer_pool_size = 321这是一个错误,因为它没有单位前缀,给出了无效的值(根据文档,最小值为5242880),然后将其置于先前的值。测试服务器中的该值设置为所需的321M。 如我所说,我还没有完全测试过。我所做的是降低测试价值并尝试应用程序。一切都变慢了,我发布的特定查询将在3分钟内执行。 …

1
是否可以从BLACKHOLE表中恢复数据?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 我已经使用引擎BLACKHOLE创建了表, 基本上,BLACKHOLE存储引擎充当了“黑洞”,该黑洞可以接受数据,但会将其丢弃而不进行存储。检索总是返回空结果。 听说我们可以通过使用存储引擎为innodb或myisam的新表创建与旧表相同的新表来检索数据。但是我也尝试过,但是无法获得结果。任何人都可以帮助我解决此问题。 mysql> CREATE TABLE test1(i INT, c CHAR(10)) ENGINE = BLACKHOLE; Query OK, 0 rows affected (0.08 sec) mysql> INSERT INTO test1 VALUES(1,'record one'),(2,'record two'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from …

3
MySQL中两个具有相同名称的表
今天,我放下一张临时桌子时遇到了这个奇怪的问题。我删除了临时表,然后对表进行了描述以进行验证。但是,该表未删除。经过一番搜索,我发现: MySQL允许创建一个与永久表同名的临时表。因此临时表被删除,而不是永久表。我对正在使用哪张桌子感到非常困惑。 MySQL版本:5.1.36-enterprise-gpl-pro-log 这是我测试过的: mysql> create table test(id int); Query OK, 0 rows affected (0.00 sec) mysql> desc test; | Field | Type | Null | Key | Default | Extra | -------------------------------------------------- id int(11) YES NULL mysql> create temporary table test(id int); Query OK, 0 rows affected (0.00 sec) …
8 mysql  table 


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.