我在myISAM中拥有了所有表,但是当我长时间运行更新作业时,表级锁定开始杀了我.我将我的主表转换为InnoDB,现在我的许多查询都需要花费1分钟才能完成,这些查询几乎是在myISAM上完成的.他们通常陷入困境Sorting result.我做错什么了吗?
例如 :
SELECT * FROM `metaward_achiever`
INNER JOIN `metaward_alias` ON (`metaward_achiever`.`alias_id` = `metaward_alias`.`id`)
WHERE `metaward_achiever`.`award_id` = 1507
ORDER BY `metaward_achiever`.`modified` DESC
LIMIT 100
Run Code Online (Sandbox Code Playgroud)
现在大约需要90秒.这是描述:
+----+-------------+-------------------+--------+-------------------------------------------------------+----------------------------+---------+---------------------------------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+--------+-------------------------------------------------------+----------------------------+---------+---------------------------------+-------+-----------------------------+
| 1 | SIMPLE | metaward_achiever | ref | metaward_achiever_award_id,metaward_achiever_alias_id | metaward_achiever_award_id | 4 | const | 66424 | Using where; Using filesort |
| 1 | SIMPLE | …Run Code Online (Sandbox Code Playgroud) 使用PHP的mysqli如何应用行级锁定?
行级别锁定会阻止编辑当前符合条件的当前行的任何人吗?但他们是否阻止用户插入符合您条件的行?
谢谢
我一直在阅读是否使用myisam或innodb作为日志表(大量写入,很少读取).虽然有些人说myisam总体上更快,资源更少,但其他人说myisam实际上是更糟糕的选择,因为它只有表级锁定.
有没有人有这种情况的实际经验并且小心分享他们的建议?
提前致谢
我发生了以下查询
public function test()
{
$uuid = substr( String::uuid() , 4 , rand( 7 , 10 ) );
$name = $uuid;
$event = $this->Event->getEvent( array( "event_id" => "5240e695-9acc-4e32-9b98-1aecb3d0838" ) );
$event[ "event_name" ] = $name;
$this->Event->update( $event );
debug( $this->Event->search( array( "event_id" => $event[ "event_id"] ) )[ 0 ][ "event_name" ] );
debug( $this->Event->search( array( "event_id" => $event[ "event_id"] , "limit" => 1 ) )[ 0 ][ "event_name" ] );
}
Run Code Online (Sandbox Code Playgroud)
我为从mySQL(InnoDB)表中检索的特定事件分配一个随机名称event,为其分配一个随机的新名称,并将其保存回数据库中.
当我在此代码中运行最后两个语句时,结果不一样,请注意第二个查询中的最后一个参数只是将LIMIT 1添加到第二个查询的末尾.(我没有使用CakePHP 2.x搜索表的典型方法).第一次搜索调用的结果将产生先前请求的先前结果,而第二次搜索调用将在event表中产生实际当前更新的名称.
我一直在寻找如何从数据源对象中删除查询缓存COMPLETELY,但无法弄清楚如何.我已经尝试在数据源对象上使用flushMethodCache(),但它什么也没做,我试过设置 …
因此,今晚似乎无处不在,我的wordpress网站崩溃了,我已将其追溯到mysql问题。Mysql不会在服务器上启动,因为它一直在失败。
这是我从日志中得到的信息:
140226 08:54:11 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
140226 08:58:20 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
140226 8:58:20 [Note] Plugin 'FEDERATED' is disabled.
140226 8:58:20 InnoDB: The InnoDB memory heap is disabled
140226 8:58:20 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140226 8:58:20 InnoDB: Compressed tables use zlib 1.2.3
140226 8:58:20 InnoDB: Using Linux native AIO
/usr/libexec/mysqld: Can't create/write to file '/dev/shm/mysql/ibOqUOjF' (Errcode: 2)
140226 8:58:20 InnoDB: Error: unable to create temporary file; errno: …Run Code Online (Sandbox Code Playgroud) 我认为我对SELECT FOR UPDATE构造感到困惑.
例:
mysql> select * from employees2;
+-------+----------+--------+-----------+
| EmpId | EmpName | DeptId | EmpSalary |
+-------+----------+--------+-----------+
| 1 | John | 1 | 5000.00 |
| 2 | Albert | 1 | 4500.00 |
| 3 | Crain | 2 | 6000.00 |
| 4 | Micheal | 2 | 5000.00 |
| 5 | David | NULL | 34.00 |
| 6 | Kelly | NULL | 457.00 |
| 7 | Rudy …Run Code Online (Sandbox Code Playgroud) 我在生产中使用Percona 5.1服务器,在我们的生产数据库中使用MyISAM表.为了支持数据库事务,我需要将表更新为InnoDB.我们目前正在开发中使用MySQL 5.5,并且迁移脚本可以通过简单ALTER TABLE xyz ENGINE=InnoDB;查询运行良好.但是在生产测试中(针对生产数据库的副本),我们收到了一个错误:
mysql> ALTER TABLE `xyz` ENGINE=InnoDB;
ERROR 1005 (HY000): Can't create table 'InnoTest.#sql-644_dd133' (errno: 1478)
Run Code Online (Sandbox Code Playgroud)
在我们的开发服务器上,使用与生产测试相同的数据库转储:
mysql> ALTER TABLE `xyz` ENGINE=InnoDB;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 2
mysql> show warnings;
+---------+------+------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------+
| Warning | 1478 | InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. |
| Warning | 1478 | InnoDB: assuming ROW_FORMAT=COMPACT. |
+---------+------+------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
和统计数据:
mysql> SHOW VARIABLES LIKE …Run Code Online (Sandbox Code Playgroud) 我在Maria DB 10.1.8(https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/)上设置了表级InnoDB数据库加密.
我想知道是否有任何方法可以确认数据是否真正加密.我已经尝试在表中搜索/ var/lib/mysql/ibdata1中的样本数据,但我不知道这是否是可靠的测试.
这是我有的:
table content : cat_id product_id data1 data2 etc.
这些类别显然不是唯一的.产品ID是独一无二的.
2 queries :
1 -- SELECT * WHERE cat_id = :cat - must be as quick as possible
2 -- SELECT * WHERE product_id = :prodId
In second select, I can add : AND cat_id = :cat
效率更高的是什么?
有关信息,我将在每个类别中有大约20种产品和许多类别(比如3000) - 并且(因为它在表中是独一无二的)一个产品只属于一个类别 …
我想在事务内锁定表。像这样:
DB::transaction(function (){
DB::statement('LOCK TABLES important_table WRITE');
//....
});
Run Code Online (Sandbox Code Playgroud)
但是,该行DB::statement('LOCK TABLES important_table WRITE');始终会触发以下错误:
SQLSTATE [HY000]:常规错误:2014当其他无缓冲查询处于活动状态时,无法执行查询。考虑使用PDOStatement :: fetchAll()。另外,如果您的代码只打算针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。(SQL:LOCK TABLES officeSeal WRITE)
如何锁定Laravel中的桌子?