我们(显然)昨晚的Solaris MySQL数据库引擎执行得很糟糕.至少有一些InnoDB表已损坏,事务日志中的时间戳乱序错误,以及有关索引损坏的特定错误.
我们知道可用于MyISAM表修复的工具,但找不到InnoDB的任何内容.
附注:尝试表优化(在我尝试重建损坏的索引时)会导致数据库服务器崩溃.
我正在为我的学习编写一个网络应用程序,其中包括全文搜索和外键.
我在某处读过,MyISAM引擎适用于全文搜索,而InnoDB适用于外键.
在这种情况下,我应该使用什么引擎才能获得最佳性能?
在MySQL数据库的上下文中,我不能为我的生活记住页面是什么.当我看到8KB /页的内容时,这意味着每行8KB还是......?
我试图用新表替换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.现在我正在寻找
我尝试删除外键并重新创建它们,但由于表格很大,需要几个小时.替换表的重点是在有限的停机时间内进行模式更改.
我一直在导入大量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) 我试图通过临时禁用其索引来加速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数据库尽可能高效地协同工作.
目前,我正在调整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现在不会启动.
磁盘未满.系统日志如下
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) 是否可以自动增加非主键?
表"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"中的列?
替代方案,讨论:
如上所述,我想简单地这样做.替代方案并不乐观.
book_id, timestamp, user_id.在这种情况下,我会创建一个额外的索引.book_comments_votes整个PK中的comment_id .这将超过表格的三倍.建议?思考?
我为用户创建了一个消息传递系统,它允许他们向另一个用户发送消息.如果这是他们第一次说话,那么就会启动新的会话,如果不是旧的会话继续.
用户收件箱列出了用户与所有其他用户进行的所有对话,然后由具有最新帖子的对话对这些对话进行排序.
用户只能与另一个用户进行一次对话.
当用户点击其中一个对话时,他们会被带到一个页面,显示他们在顶部有最新帖子的整个对话.所以它有点像消息聊天功能.
我有两张桌子:
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) innodb ×10
mysql ×10
database ×3
caching ×1
csv ×1
file ×1
indexing ×1
myisam ×1
performance ×1
permissions ×1
php ×1
primary-key ×1
repair ×1
sql ×1
transactions ×1