Mysql Innodb 引擎优化

InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句 提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常 小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
Innodb 的创始人:Heikki Tuuri
Heikki Tuuri在Innodb的Bug社区里也是很活跃的,如果遇到Bug也可以直接提到社区,得到作者的解答。

Posted in mysql. 评论暂缺 »

mysql优化 How to Optimising MYSQL

(这是从国外一个论坛中看到的一篇帖子,关于mysql优化,思路很不错) I’d like to share with the interworx-cp community my knowledge about tuning / tweaking mysql. First of all, sorry if my English is not perfect. Maybe some sentences may be difficult to understand. So do not hesitate to ask me for explanations :-p Secondly, the default INTEWORX-CP mysql setup works very fine and is [Read More →]

Posted in mysql. 评论暂缺 »

mysql常见问题集锦

首先你应该试着找出问题mysqld守护进程是否死掉或你的问题是否与你的客户有关。你可以用mysqladmin version检查你的mysqld服务器正常执行了多长时间,如果mysqld死了,你可以在文件“mysql-data- directory/’hostname’.err”中找到其原因。 使用MySQL时的一些常见错误 MySQL server has gone away 常见的原因是服务器超时了并且关闭了连接。缺省地,如果没有事情发生,服务器在 8个小时后关闭连接。你可在启动mysqld时通过设置wait_timeout变量改变时间限制。 如果mysqld得到一个太大或不正常的包,它认为客户出错了并关闭连接。 Can’t connect to [local] MySQL server 通常意味着没有一个MySQL服务器运行在系统上或当试图连接mysqld服务器时,你正在使用一个错误的套接字文件或TCP/IP端口。 检查(使用ps)服务器上是否有一个名为mysqld的进程启动 如果一个mysqld进程正在运行,可以通过尝试这些不同的连接来检查服务器 shell> mysqladmin version shell> mysqladmin variables shell> mysqladmin -h `hostname` version variables shell> mysqladmin -h `hostname` –port=3306 version shell> mysqladmin -h ‘ip for your host’ version shell> mysqladmin –socket=/tmp/mysql.sock version 注意hostname命令使用反引号“`”而非正引号“’”;这些导致hostname输出(即,当前主机名)被代替进mysqladmin命令中。 Host ‘…’ is [Read More →]

Posted in mysql. 评论暂缺 »

mysql如果数据不存在,则插入新数据,否则更新

今天在修改ecshop时添加多语言项: //如果不存在,则插入新数据             $sql = "INSERT INTO {$ecs->table(‘cat_lang’)} (cat_id,lang_id,cat_name,keywords,cat_desc)             VALUES({$cat_id},{$k},’{$val['cat_name']}’,’{$val['keywords']}’,’{$val['cat_desc']}’)              ON DUPLICATE KEY UPDATE cat_name=’{$val['cat_name']}’,cat_desc=’{$val['cat_desc']}’,keywords=’{$val['cat_desc']}’"; 这里要注意的是:必须表主键唯一 。这里,这里我采用的是 分类id和语言id双主键机制。

Posted in mysql. 评论暂缺 »

关于mysql密码的一些札记——password和old_password

      今天在搞一mysql服务器时,看到–old-passwords选项,心中迷惑。特检索了一些资料。并log之,以备遗忘!    –old-passwords选项的目的是当服务器生成长密码哈希值时,允许你维持同4.1之前的客户端的向后兼容性。该选项不影响鉴定(4.1和以后版本的客户端仍然可以使用有长密码哈希值的账户),但它防止在密码更改操作中在user表中创建长密码哈希值。在这种情况下,该账户不能再用于4.1之前的客户端。没有–old-passwords选项,可能会出现下面的不期望的情况: ·         旧客户端连接有短密码哈希值的账户。 ·         客户更改自己的密码。没有–old-passwords,可以为该账户生成长密码哈希值。 ·         下次旧客户试图连接账户时不能连接上,因为账户有长密码哈希值,需要新的哈希机制进行鉴定。(一旦账户user表中为长密码哈希值,只有4.1和以后版本的客户端可以鉴定它,因为4.1之前的客户端不理解长哈希)。 根据以上资料。我们可以来做一下测试。 mysql> show variables like ‘%password%’; +—————+——-+ | Variable_name | Value | +—————+——-+ | old_passwords | OFF   |  ####这里表明已经关闭了旧密码选项 +—————+——-+ 1 row in set (0.00 sec) ##测试一下密码长度mysql> select password(’123456′),length(password(’123456′)); +——————————————-+—————————-+ | password(’123456′)                        | length(password(’123456′)) | +——————————————-+—————————-+ | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |                         41 | +——————————————-+—————————-+ 1 row in [Read More →]

Posted in mysql. 评论暂缺 »

mysql mirrors

来自sohu的mirror 这里包含了mysql的各个版本,和官网一致 http://mirrors.sohu.com/mysql/ 感谢sohu!

Posted in mysql. 评论暂缺 »

高效的MySQL分页

来源:http://chaoqun.17348.com/2009/04/efficient-pagination-using-mysql/ PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”Efficient Pagination Using MySQL“的报告,有很多亮点,本文是在原文基础上的进一步延伸。 首先看一下分页的基本原理: mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20\G ***************** 1. row ************** id: 1 select_type: SIMPLE table: message type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 10020 Extra: 1 row in set (0.00 sec) limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。 [Read More →]

Posted in mysql, php, python. 评论暂缺 »

MySQL Order By索引优化

转自http://www.phpq.net/mysql/mysql-order-by.html) 在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序。尽管 ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的 ORDER BY 字段在 WHERE 子句中都被包括了。 使用索引的MySQL Order By 下列的几个查询都会使用索引来解决 ORDER BY 或 GROUP BY 部分: SELECT * FROM t1 ORDER BY key_part1,key_part2,… ; SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2; SELECT * FROM t1 WHERE key_part1=constant GROUP BY key_part2; SELECT * FROM [Read More →]

Posted in mysql. 评论暂缺 »

mysql 中where 和 order by 的索引优化

mysql的where和order by 在一起时,order by 后的索引不能命中。 有这样的问题: mysql> explain SELECT * FROM product WHERE compID = 120  LIMIT 0,15; +—-+————-+————+——+——————+———–+———+——-+——+——-+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +—-+————-+————+——+——————+———–+———+——-+——+——-+ | 1 | SIMPLE | product | ref | comp_prod,compID | comp_prod | 4 [Read More →]

Posted in mysql. 评论暂缺 »

关于innodb外键约束

1. 什么是参照完整性? ——————– 参照完整性(完整性约束)是数据库设计中的一个重要概念,当数据库中的一个表与一个或多个表进行关联时都会涉及到参照完整性。比如下面这个例子: 文章分类表 – categories category_id     name 1               SQL Server 2               Oracle 3               PostgreSQL 5               SQLite 文章表 – articles article_id      category_id     title 1               1               aa 2               2               bb 3               4               cc 可见以上两个表之间是通过category_id,其中categories表有4条记录,articles表有3条记录。 然而可能因为某种原因我们删掉了categories 表中category_id=4的记录,而articles表却还是有一条category_id=4的记录,很明显,category_id=4的这条 记录不应该存在在articles表中,这样会很容易造成数据错乱。 相反,外键关系(Foreign Key relationships)讨论的是父表(categories)与子表(articles)的关系,通过引入外键(Foreign Key)这个概念来保证参照完整性(Referential integrity),将使会数据库变的非常简单。比如,要要做到删除categories表中category_id=4记录的同时删除 articles 表中category_id=4的所有记录,如果没有引入外键的话,我们就必须执行2条SQL语句才行;如果有外键的话,可以很容易的用一条SQL语句就 可以达到要求。 2. 使用外键的条件 —————– MySQL只在v3.23.34版本以后才引入外键的,所以在这之前的版本就别想了:),除此之外,还必须具备以下几个条件: 1) 在my.cnf配置文件中打开InnoDB引擎支持。 # Uncomment the following [Read More →]

Posted in mysql. 评论暂缺 »