标签: innodb

如何修复InnoDB表?

我们(显然)昨晚的Solaris MySQL数据库引擎执行得很糟糕.至少有一些InnoDB表已损坏,事务日志中的时间戳乱序错误,以及有关索引损坏的特定错误.

我们知道可用于MyISAM表修复的工具,但找不到InnoDB的任何内容.

附注:尝试表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃.

mysql repair innodb

34
推荐指数
3
解决办法
15万
查看次数

为什么MySQL的MyISAM引擎不支持外键?

我正在为我的学习编写一个网络应用程序,其中包括全文搜索和外键.

我在某处读过,MyISAM引擎适用于全文搜索,而InnoDB适用于外键.

在这种情况下,我应该使用什么引擎才能获得最佳性能?

  • 为什么MyISAM不支持外键关系,但InnoDB呢?
  • 为什么MyISAM支持全文搜索,但InnoDB不支持?

mysql database myisam innodb

34
推荐指数
1
解决办法
4万
查看次数

MySQL:什么是页面?

在MySQL数据库的上下文中,我不能为我的生活记住页面是什么.当我看到8KB /页的内容时,这意味着每行8KB还是......?

mysql database innodb

32
推荐指数
3
解决办法
3万
查看次数

重命名InnoDB表而不更新外键引用?

我试图用新表替换InnoDB表,我希望所有指向旧表的外键引用指向新表.

所以我尝试了这个:

SET foreign_key_checks = 0;
ALTER TABLE foo RENAME foo_old;
ALTER TABLE foo_new RENAME foo;
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使禁用了foreign_key_checks,指向foo的所有引用都会更改为指向foo_old.现在我正在寻找

  • 一种在不重建整个表的情况下更改外键引用的方法,或者
  • 一种重命名表而不更新外键引用的方法.

我尝试删除外键并重新创建它们,但由于表格很大,需要几个小时.替换表的重点是在有限的停机时间内进行模式更改.

mysql innodb

32
推荐指数
4
解决办法
1万
查看次数

为什么TRANSACTION/COMMIT使用PHP/MySQL(InnoDB)提高了性能?

我一直在导入大量CSV数据文件; 通常少于100,000条记录.我正在使用PHP和MySQL(InnoDB表).我需要使用PHP来转换某些字段并在MySQL之前进行一些文本处理INSERT(process_note_data()下面代码的一部分).MySQL LOAD DATA是不可行的,所以请不要建议.

我最近尝试使用START TRANSACTION和使用MySQL事务来提高此过程的速度COMMIT.性能提升令人惊讶.处理时间减少了20倍.因此,20分钟的处理只需要大约1分钟.

质询.

1.)有谁理解为什么有这样的性能提升(20分钟到1分钟)?

2.)我应该关注10万条记录的交易量有多大?

3.)我是否应该关注交易中的大量插入和/或更新?

/*
 * Customer Notes Data:
 * Rows are either a meeting, call or note!
 */
$row = 1;
$data = array();
$fields = array();
$line = '';

$db->query('SET autocommit=0;');
$db->query('START TRANSACTION;');

if (($handle = fopen("modules/".$currentModule."/Data/customernote.csv", "r")) !== FALSE) {
  while (($data = fgetcsv($handle, 4096, ',', '"')) !== FALSE && $row < 999000) {
    //Row 1 - CSV header row with field …
Run Code Online (Sandbox Code Playgroud)

php mysql csv innodb transactions

32
推荐指数
2
解决办法
3万
查看次数

如何在innodb中禁用索引

我试图通过临时禁用其索引来加速InnoDB表中的批量插入:

ALTER TABLE mytable DISABLE KEYS;
Run Code Online (Sandbox Code Playgroud)

但它发出警告:

+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'mytable' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

我们如何禁用索引?

在进行批量插入时,有哪些替代方法可以避免使用索引?

我们怎样才能加快这个过程?

mysql indexing innodb

31
推荐指数
4
解决办法
5万
查看次数

MySQL查询缓存:限制为最大缓存大小为128 MB?

我的应用程序是数据库密集型的,所以我已经非常努力地确保应用程序和MySQL数据库尽可能高效地协同工作.

目前,我正在调整MySQL查询缓存,以使其符合在服务器上运行的查询的特征.

query_cache_size是可以存储在缓存query_cache_limit中的最大数据量,它是缓存中单个结果集的最大大小.

我当前的MySQL查询缓存配置如下:

query_cache_size=128M
query_cache_limit=1M
Run Code Online (Sandbox Code Playgroud)

tuning-primer.sh 给我以下有关正在运行的系统的调整提示:

QUERY CACHE
Query cache is enabled
Current query_cache_size = 128 M
Current query_cache_used = 127 M
Current query_cache_limit = 1 M
Current Query cache Memory fill ratio = 99.95 %
Current query_cache_min_res_unit = 4 K
However, 21278 queries have been removed from the query cache due to lack of memory
Perhaps you should raise query_cache_size
MySQL won't cache query results that are larger than query_cache_limit in size
Run Code Online (Sandbox Code Playgroud)

mysqltuner.pl …

mysql performance caching innodb

30
推荐指数
4
解决办法
8万
查看次数

Mysql无法启动 - ibdata1腐败? - 操作系统错误号13 - 权限问题

服务器因电源故障而关机.
Mysql现在不会启动.
磁盘未满.系统日志如下

Oct 11 15:03:31 joe mysqld_safe[24757]: started
Oct 11 15:03:31 joe mysqld[24760]: 101011 15:03:31  InnoDB: Operating system error number 13 in a file operation.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: The error means mysqld does not have the access rights to
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: the directory.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: File name ./ibdata1
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: File operation call: 'create'.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: Cannot continue operation.
Run Code Online (Sandbox Code Playgroud)

mysql permissions innodb file

30
推荐指数
7
解决办法
7万
查看次数

Mysql Innodb:自动增量非主键

是否可以自动增加非主键?

表"book_comments"

book_id     medium_int
timestamp   medium_int
user_id     medium_int
vote_up     small_int
vote_down   small_int
comment     text
comment_id  medium_int

Primary key -> (book_id, timestamp, user_id)
Run Code Online (Sandbox Code Playgroud)

此表上没有其他索引.但是,我想使comment_id列自动增量,以便我可以轻松地创建另一个表:

表"book_comments_votes"

comment_id  (medium_int)
user_id     (medium_int)

Primary key -> (comment_id, user_id)
Run Code Online (Sandbox Code Playgroud)

用户只能在每次评论时投票一次.此表通过主键强制执行此规则.

题:

是否可以自动递增非主键 - 例如,自动递增comment_id表"book_comments"中的列?

替代方案,讨论:

如上所述,我想简单地这样做.替代方案并不乐观.

  • 制作commnet_id PK并通过唯一索引强制执行完整性book_id, timestamp, user_id.在这种情况下,我会创建一个额外的索引.
  • 保留PK并替换book_comments_votes整个PK中的comment_id .这将超过表格的三倍.

建议?思考?

mysql innodb primary-key

29
推荐指数
1
解决办法
3万
查看次数

有没有更简单的方法来实现这种用户消息传递方式?

我为用户创建了一个消息传递系统,它允许他们向另一个用户发送消息.如果这是他们第一次说话,那么就会启动新的会话,如果不是旧的会话继续.

用户收件箱列出了用户与所有其他用户进行的所有对话,然后由具有最新帖子的对话对这些对话进行排序.

用户只能与另一个用户进行一次对话.

当用户点击其中一个对话时,他们会被带到一个页面,显示他们在顶部有最新帖子的整个对话.所以它有点像消息聊天功能.

我有两张桌子:

  • userconversation
  • usermessages

userconversation

包含一个自动增量ID,它是会话ID,以及userId和friendId.

无论是谁发起第一个对话都将是userId和收件人friendId,这将永远不会改变该对话.

+----+--------+----------+
| id | userId | friendId |
+----+--------+----------+
Run Code Online (Sandbox Code Playgroud)

usermessages

包含特定消息,以及读取标志,时间和conversationId

+----+---------+--------+------+------+----------------+
| id | message | userId | read | time | conversationId |
+----+---------+--------+------+------+----------------+
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

当用户转到另一个用户的消息时,将运行查询以检查两个用户是否在userconversation表中匹配,如果是,conversationId则使用该会话并且会话继续进行,如果不是,则为他们创建具有唯一的新行conversationId.

它变得复杂的地方

到目前为止一切都很好,但是当涉及到显示所有对话的消息收件箱时,按照最新的帖子进行排序,一个查询就变得棘手了.

为了能够列出对话,您必须首先找到每个对话的最新帖子,但由于您无法在组之前订购,因此无法对两个表上的一个查询进行排序,因此我必须使用以下内容:

SELECT  
    c.id,
    c.userId,
    c.friendId,
    m2.message,
    m2.read,
    UNIX_TIMESTAMP(m2.time),      
    user1.username,
    user2.username  
FROM 
    (SELECT MAX(m1.id) AS MessageID 
     FROM usermessages m1 
     GROUP BY m1.conversationId) latest_msg

INNER JOIN usermessages m2 ON latest_msg.MessageID = m2.id 
INNER JOIN userconversation c ON m2.conversationId …
Run Code Online (Sandbox Code Playgroud)

mysql sql database database-design innodb

28
推荐指数
2
解决办法
1985
查看次数