Questions tagged «mysql»

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

1
我应该如何解释mysql慢查询日志中的“锁定时间”?
我试图了解如何最好地解释查询的锁定时间,这些查询显示在我们的MySQL慢查询日志中。 例如,如果UPDATE查询的锁定时间为10秒。我认为这是更新查询获得锁之后的总时间。即使它正在等待先前的选择查询完成但不执行UPDATE操作本身,时钟也应该滴答作响,因为它锁定了所有在UPDATE查询之后排队的SELECT查询。 以及SELECT查询锁如何。为什么某些选择查询具有锁定时间?是因为有后续的UPDATE查询,因此他们将表锁定在一起。
12 mysql  locking 

2
MySQL索引维护
我做了很多有关如何在MySQL中维护索引以防止碎片并以某种方式优化查询执行的研究。 我熟悉该公式,该公式可计算表的最大可用空间与数据和索引使用的空间之间的比率。 但是我的主要问题仍然没有答案。也许这是由于我熟悉SQL Server中的索引维护,并且我倾向于认为在MySQL中它应该在某种程度上相似。 在SQL Server中,您可以具有多个索引,并且每个索引可以具有不同级别的碎片。然后,您可以选择一个并在该特定索引中执行“ REORGANIZE”或“ REBUILD”操作,而不会影响其余的索引。 据我所知,没有这种“表碎片”,并且SQL Server没有提供任何工具来修复“表碎片”。它确实提供了检查索引碎片的工具(可以理解为索引碎片使用的工具,例如索引所使用的页数与该页的填充度和连续性之间的比率),以及内部和外部碎片。 至少对于我来说,所有这些都是很容易理解的。 现在,当轮到在MySQL中维护索引时,如上所述,仅存在“表碎片”的概念。 MySQL中的一个表可以有多个索引,但是当我用那个著名的公式检查“碎片率”时,我看不到每个索引的碎片,而是整个表。 当我想优化MySQL中的索引时,我不选择要操作的特定索引(如SQL Server中一样)。相反,我在整个表中执行“ OPTIMIZE”操作,这大概会影响所有索引。 当在MySQL中优化表时,数据+索引使用的空间与整个空间之间的比率将减小,这表明硬盘驱动器中进行了某种物理重组,这意味着物理空间的减少。但是,索引碎片不仅与物理空间有关,而且与由于插入和更新而随时间变化的树的结构有关。 最后,我在InnoDB / MySQL中得到了一个表。该表具有300万条记录,105列和55个索引。它是1.5GB(不包括索引),后者是2.1GB。 每天都要对该表进行数千次点击以进行更新和插入(实际上,我们并未删除记录)。 该表已经创建多年,我可以肯定没有人维护索引。 我原本希望在那里找到一个巨大的碎片,但是当我按照规定执行碎片计算时 free_space / (data_length + index_length) 事实证明,我的碎片只有0.2%。恕我直言,这是非常不现实的。 因此,主要问题是: 如何检查MySQL中特定索引的碎片,而不是整个表格 OPTIMIZE TABLE是否像SQL Server一样实际修复了索引的内部/外部碎片? 当我在MySQL中优化表时,它实际上会重建表上的所有索引吗? 认为减少索引的物理空间(而不重建树本身)实际上转化为更好的性能是否现实?

3
从带有标题的CSV文件创建表
我正在寻找一种仅基于指定CSV内容生成新MySQL表的方法。我将使用的CSV文件具有以下属性; “ |” 定界的。 第一行指定列名称(标题),也为“ |” 定界的。 列名和顺序不固定。 列数不固定。 文件很大(100万行/ 50列)。 在Excel中,这非常简单,但是对于MySQL来说似乎并非如此(谷歌不走运)。对我应该看的东西有什么建议吗?
12 mysql  csv  import  bulk 

3
更改外键约束所需的最低特权是什么?
更改外键约束所需的最低特权是什么? MySQL 5.5.41修复此错误后,我的迁移脚本停止工作: InnoDB允许创建一个外键,该外键引用用户没有足够特权的父表。(缺陷号18790730) 我收到此错误: SQLSTATE [42000]:语法错误或访问冲突:对表'core.users'的用户'foo'@'localhost'拒绝了1142 REFERENCES命令(SQL:更改表`user_baz`添加约束user_baz_user_id_foreign外键(`user_id))引用用户`(`id`)上的`core`.`users(在更新级联上删除级联) 这意味着我需要修复特权。我需要的最低特权是什么?
12 mysql 

3
如何在一个查询中进行多个计数?
我用类似的查询来计数记录 SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%' SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%' SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%' 对于每个计数,mysql需要遍历整个表,如果表很长且有许多查询,这将是一个大问题。 我想知道是否有一种方法可以在一个查询中进行所有计数。在这种情况下,当mysql遍历每一行时,它将处理所有计数,而无需一遍又一遍地扫描整个表。

2
MySQL-删除具有外键约束且引用自身的行
我有一个表,用于存储用户在我的网站上发布的所有论坛消息。消息层次结构是使用嵌套集模型实现的。 以下是该表的简化结构: ID(主键) Owner_Id(对ID的外国主要参考) Parent_Id(对ID的外国主要参考) 左 好吧 级别 现在,表格看起来像这样: + ------- + ------------- + -------------- + ---------- + ----------- + ----------- + | Id | Owner_Id | Parent_Id | nleft | nright | nlevel | + ------- + ------------- + -------------- + ---------- + ----------- + ----------- + | 1 …

3
如何强制MySQL忽略所有索引?
我已经阅读了有关FORCE索引的文章,但是如何强制MySQL进行IGNORE ALL索引呢? 我尝试过SELECT * FROM tbl IGNORE INDEX(*),但是没有成功。 至于为什么我(和其他人)需要这样做:例如,我需要像这样通过tld总结引荐来源统计信息: SELECT count(*) as c, SUBSTRING ( domain_name, LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2 ) as tld FROM `domains_import` IGNORE INDEX(domain_name) GROUP BY tld ORDER BY c desc LIMIT 100 ...但是我始终必须查看定义了哪些索引,或者确定将通过Explain使用哪些索引。简单地编写IGNORE INDEX ALL而不关心就非常方便。 有人知道语法或技巧吗?(数十行通过MySQL定义表的行实际上不是捷径)。 从聊天讨论中添加: 贝克马克: 无索引= 148.5秒 索引= 180秒,并且仍在与发送数据一起运行SSD阵列是如此强大,以至于您几乎不需要关心数据缓存... 基准的定义: CREATE …
12 mysql  index  mysql-5.6 

4
标识栏重新设置种子:何时需要?
在大学的最后一课中(我是学生),讲师要求我们开发数据库(如果重要的话,请使用MySQL Server)和小型客户端应用程序,该应用程序会将数据库用作数据源。 要求之一是,身份列(每个表中的PK)必须是顺序的,因为这是一种好习惯(按照讲师的话)。也就是说,当删除表行时,必须在后续插入中重用它的PK。我对RDBMS,PK和标识列有一般的了解。据我了解,标识列只是让数据库在插入行时自动生成PK的一种方式。标识列值不得以任何方式与行属性相关(只要它不是自然键即可)。 这个要求(严格按照顺序标识列)对我来说是可疑的。我试图问讲师,如果身份不是顺序的(由于删除引起的空白),那又有什么问题,但是却得到了非常抽象的答案,例如“它对用户方便,对维护数据库的数据库管理员有用”。没有具体的例子。“方便用户”这一说法听起来很愚蠢,因为它在业务领域没有任何意义。 因此,我很好奇这些原因是否真实?我只想到一种情况,即需要重新分配标识列种子时–当标识空间用尽时。但是,当标识列类型选择不正确时,例如用“ simple” int代替,bigint或者uniqueidentifier表包含十亿行时,这将是更多的设计问题。假设身份列是聚集索引:身份列中的间隙会影响索引性能吗?也许还有其他现实原因导致我不知道的每次删除后重新自动标识列的种子? 提前致谢!

2
如何为可以具有不同属性集的实体类型建模?
在用Users和Items之间的一对多(1:M)关系重新创建数据库时遇到了一些麻烦。 是的,这很简单。但是,每个项目都属于某个类别(例如Car,Boat或Plane),并且每个Category具有特定数量的属性,例如: Car 结构体: +----+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | +----+--------------+--------------+ Boat 结构体: +----+--------------+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | Attribute #3 | +----+--------------+--------------+--------------+ Plane 结构体: +----+--------------+--------------+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | Attribute #3 | Attribute #4 | +----+--------------+--------------+--------------+--------------+ …

5
无法创建文件/var/lib/mysql/user.lower-test
MySQL数据库已经几个月没有问题了。今天,当我使用Synaptic软件包管理器检查可升级软件包时,它附带了各种MySQL组件(-common,-client,-server等)。因此,我决定升级(我忘记记下已安装的版本,但认为它是5.6.21)升级到5.6.25-1-ubuntu2.0。 Error occured: Can't connect to MySQL server on '127.0.0.1' (111) 然后,我发现服务器未运行。在日志文件中,我喜欢以下消息: Can't create file /var/lib/mysql/user.lower-test 我已经花了一个小时左右的时间进行在线搜索,尽管以前已经报告过该问题,但在“更新后”问题的背景下却没有看到它,因此不确定下一步是否可以解决。
11 mysql  linux 

2
INSERT INTO新创建的目标表后,ROLLBACK不起作用
我正在研究将CSV文件(customers.csv)导入MySQL表(customers)的PHP脚本。 在将CSV文件的内容插入mysql表之前,我首先备份原始customers表。 我将整个导入过程(包括备份)包装在mysql事务中(以解决CSV在中间某处损坏的情况,并确保导入是原子的)。 问题是,当我在INSERT INTO语句后立即调用它时,ROLLBACK似乎不起作用:通过phpMyAdmin检查数据库时,我可以看到新创建的表,并且roollback之后仍存在ROWS INSIDE IT。 这是操作日志: [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] [] [2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] [] [2015-01-19 14:08:50] DEBUG: "ROLLBACK" …

2
查找每个连续系列行的总持续时间
MySQL版本 该代码将在MySQL 5.5中运行 背景 我有一张像下面的桌子 CREATE TABLE t ( id INT NOT NULL AUTO_INCREMENT , patient_id INT NOT NULL , bed_id INT NOT NULL , ward_id INT NOT NULL , admitted DATETIME NOT NULL , discharged DATETIME , PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 该表与医院中的患者有关,并且存储每个患者住院时花时间的床铺。 每个病房可能有多个病床,每个病人可能会移到同一病房内的另一个病床。 目的 我想做的是找出每个患者花了多少时间在一个特定的病房而又没有转移到另一个病房。即,我想找到他在同一病房中度过的连续时间的总持续时间。 …

1
“限制1000,25”与“限制25偏移1000”
最近,我发现MySQL具有一项offset功能。我一直在尝试寻找有关偏移量结果的文档,或者寻找偏移量和极限变量之间的差异的文档,但是我似乎找不到我要找的东西。 可以说我在一个表中有10.000行,而我要从1.000行中得到25个结果。就目前为止,我可以同时获得相同的结果: SELECT id,name,description FROM tablename LIMIT 1000,25 SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000 我想知道的是两者之间的区别。 这实际上是一样的吗?还是我的理解是错误的? 在大桌子上慢一点还是快一点 当我这样做时,偏移量的结果是否发生变化WHERE column=1(例如,列具有> 100个不同的值) 偏移量的结果在执行时是否发生变化ORDER BY column ASC(假设它具有随机值) 如果这是一个“愚蠢”的问题,并且有人知道启发该主题的任何文档,请在答复中添加它们。 我觉得偏移量跳过了数据库中找到的前X行,而无视排序和位置。
11 mysql  limits 

1
MySQL:my.cnf中的绑定地址0.0.0.0不起作用?
我是mysql新手。我想使用我想要的任何IP连接到mysql服务器。我读到我要做的就是将mybind.address = 0.0.0.0添加到my.cnf文件中。那就是我所做的。我重新启动了mysql服务器,然后从命令行对其进行了测试。 mysql -uroot -p'*password*' -h 127.0.0.1 --> Works mysql -uroot -p'*password*' -h 192.168.2.4 (local ip address) ---> ERROR 1045 (28000): Access denied for user 'root'@'mguru.lnx.gr' (using password: YES) 您可以在my.cnf文件中的mysqld部分的下面看到 [mysqld] user = mysql port=3306 socket = /opt/lampp/var/mysql/mysql.sock skip-external-locking key_buffer = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size …
11 mysql  my.cnf 

1
每天在给定时间安排活动
我希望我的活动每天00:20举行。我对时间安排感到困惑。我应该使用第一个选项还是第二个选项? 选项1 CREATE EVENT my_event ON SCHEDULE EVERY 1 DAY STARTS '2014-04-30 00:20:00' ON COMPLETION PRESERVE ENABLE DO # My query 选项2 CREATE EVENT my_event ON SCHEDULE AT ('2014-04-30 00:20:00'+ INTERVAL 1 DAY) ON COMPLETION PRESERVE ENABLE DO # My query
11 mysql  event 

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.