mysql – 虫虫之家 http://ijz.me 略懂技术 Sat, 11 Oct 2014 06:53:54 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.7.2 mysql忘记root密码重置 http://ijz.me/?p=675 http://ijz.me/?p=675#respond Sat, 11 Oct 2014 06:53:54 +0000 http://ijz.me/?p=675 如果忘记了root密码,通过禁止认证模式启动mysql 然后重置root密码

win下:

1:进入cmd,停止mysql服务:Net stop mysql

2:执行:mysqld-nt –skip-grant-tables
3:然后另外打开一个命入令行窗口,执行mysql(或者直接进入Mysql Command Line Cilent),此时无需输入密码即可进入。

>use mysql

>update user set password=password(“新密码”) where user=”root”;

>flush privileges;

>exit

4:重新启动mysql-nt服务,就可以用新密码登录了。

linux下:

/etc/init.d/mysqld stop

启动 msyql :/usr/bin/safe_mysqld –skip-grant-tables &

mysql 进入

>use mysql

>update user set password=password(“new_pass”) where user=”root”;

>flush privileges

重启mysql : /etc/init.d/mysqld restart。

]]>
http://ijz.me/?feed=rss2&p=675 0
/zz/MySQL 常见的数据存储引擎的介绍和应用 http://ijz.me/?p=11 http://ijz.me/?p=11#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=11 以下的文章主要讲述的是MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述,希望你浏览完此文章你会在选择数据库存储引擎时带来一些帮助。以下就是文章的具体内容。

MySQL有多种存储引擎:

MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:

MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的MySQL存储引擎,除非你配置MySQL默认使用另外一个引擎。

MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。

注释:MEMORY存储引擎正式地被确定为HEAP引擎。

InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。

EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。

NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。

ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。

CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。

BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。

FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。

当你创建一个新表的时候,你可以通过添加一个ENGINE 或TYPE 选项到CREATE TABLE语句来告诉MySQL你要创建什么类型的表:

  1. CREATE TABLE t (i INT) ENGINE = INNODB;
  2. CREATE TABLE t (i INT) TYPE = MEMORY;

虽然TYPE仍然在MySQL 5.1中被支持,现在ENGINE是首选的术语。

如何选择最适合你的存储引擎呢?

下述存储引擎是最常用的:

MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的MySQL存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。

InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。

BDB:可替代InnoDB的事务引擎,支持COMMIT、ROLLBACK和其他事务特性。

Memory:将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。

Merge:允许MySQL DBA或开发人员将一系列等同的MyISAM表以逻辑方式组合在一起,并作为1个对象引用它们。对于诸如数据仓储等VLDB环境十分适合。

Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。

Federated:能够将多个分离的MySQL服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。

Cluster/NDB:MySQL的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。

Other:其他存储引擎包括CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及Example引擎(可为快速创建定制的插件式存储引擎提供帮助)。

请记住,对于整个服务器或方案,你并不一定要使用相同的存储引擎,你可以为方案中的每个表使用不同的MySQL存储引擎,这点很重要。

  1. mysql> show engines;
  2. +————+———+—————————————————————-+
  3. | Engine | Support | Comment |
  4. +————+———+—————————————————————-+
  5. | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
  6. | MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
  7. | InnoDB | YES | Supports transactions, row-level locking, and foreign keys |
  8. | BerkeleyDB | NO | Supports transactions and page-level locking |
  9. | BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) |
  10. | EXAMPLE | NO | Example storage engine |
  11. | ARCHIVE | NO | Archive storage engine |
  12. | CSV | NO | CSV storage engine |
  13. | ndbcluster | NO | Clustered, fault-tolerant, memory-based tables |
  14. | FEDERATED | NO | Federated MySQL storage engine |
  15. | MRG_MYISAM | YES | Collection of identical MyISAM tables |
  16. | ISAM | NO | Obsolete storage engine |
  17. +————+———+—————————————————————-+

以上的相关内容就是对如何选择合适的MySQL存储引擎以及MySQL各主要存储引擎特点的介绍,望你能有所收获。

]]>
http://ijz.me/?feed=rss2&p=11 0
/zz/MySQL数据库Concat和outfile函数妙用 http://ijz.me/?p=12 http://ijz.me/?p=12#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=12 大家有没有接触过这样的需求,采集历史数据库中或者其他数据库中的某些信息,这些信息是另一个服务器需要执行sql的条件。通常我们的处理手段是把这个信息通过sql找出来或导出,然后使用脚本或者手工拼凑新的新的sql语句。在很多紧急情况下(产品bug、数据错乱)会产生这样的需求,这个时候处理的是在线数据库,不能有一点马虎、如果数据量稍微大一点,DBA们就够焦头烂额了。我之前也多次遇见这种情况,我把一些经验介绍给大家。


其实这种情况下使用concat+out file会得到事半功倍的效果。
比如我们需要找到user表中昨天登录过的用户,然后修改修改他们的garbage中某个物品的属性。
由于数据库的结构,只记录用户最后一次登录的时间,所以当前的数据库中不能确定昨天哪些用户登录过。我们需要从备份中去挖出哪些用户昨天登录过,然后再

update garbage set data=value where id=xxx and num=value;

我们通常的做法是通过sql在备份数据中找到对应的用户id,然后导出到一个文件中,通过脚本来循环取id,自动生成要执行的sql,或者手工生成要执行的sql。
现在我们使用concat+out file来实现。

在重现备份数据的服务器上。

select concat('update garb103fage set data=value where id=',id,'and num=value;') from user into outfile  '/tmp/a.txt';

检查生成的文件以后,在线上服务器直接执行

source /tmp/a.txt;

这个语句还有一个妙用,用来杀掉processlist中的某些连接,索然maatkit提供了类似的工具,但是还是没有mysql自己来完成方便。

生成杀连接的语句,当然你可以使用where条件过滤某些类型的连接。

select concat('KILL ',id,';') from information_schema.processlist into outfile  '/tmp/kill.txt';source /tmp/kill.txt;

 

]]>
http://ijz.me/?feed=rss2&p=12 0
Linux下通过FTP来备份Mysql数据/zz/ http://ijz.me/?p=35 http://ijz.me/?p=35#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=35
#!/bin/bash
host=202.100.222.2   #FTP主机
UserName=test    #FTP用户名
Passwd=test        #FTP密码

 

function Iint() #处理涵数
{
backup_path=/home/mysqlbackup   #压缩文件存放的目录
file=$path-mysql-$(date +%Y-%m-%d).tar.gz #文件名
backupCWD=/usr/local/mysql/data/$path   #需备份的path
tar -Pczf $backup_path/$file $backupCWD #执行备份操作

cd $backup_path
ftp -i -n <<!
open $host
user $UserName $Passwd

cd MYSQL-BACK/$path
put   $file
bye
!
}
/etc/init.d/mysqld stop >/dev/null 2>&1 #停止Mysql服务
path=database1 #需备份的数据名
Iint #调用处理涵数
path=datebase2
Iint
/etc/init.d/mysqld start >/dev/null 2>&1 #启动Mysql服务

rm -rf $backup_path/*.tar.gz #删除压缩文件
echo “ftp back ok!”

]]>
http://ijz.me/?feed=rss2&p=35 0
mysql slow query log及应用 http://ijz.me/?p=41 http://ijz.me/?p=41#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=41 mysql有个slow query log功能就是记录运行比较慢的sql语句到日志里面,通过这个日志可以对数据库运行状态进行分析或者数据库调优。

默认不会开起这个参数,在启动数据库时候加入log-slow-queries和log-slow-time(秒)来开启slow query log。一般来说是修改my.cnf,增加两行:      log_query_time = 1
log-slow-queries = /var/PATH/slow.log
long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。log-slow-queries 日志记录的位置,可以为空,系统会给一个缺省的文件host_name-slow.log。      日志可以记录到文件或者是数据表,或者同时记录到文件和数据表中。

在实际应用中如果发现系统很慢的时候,在分析排除了其他相关问题后,就可以打开slow query log给予一个合适的时间点记录日志。运行一段时间,然后可以分析这些比较慢的语句发现存在的问题。

浏览日志可以通过mysql自带的工具mysqldumpslow

下面简单介绍一下这个工具的参数

-s,是排序方法,后面可以带c,t,l,r和ac,at,al,ar等数值,分别指按照query次数,时间,lock的时间和返回

]]>
http://ijz.me/?feed=rss2&p=41 0
MySQL 性能跟踪语句/zz/ http://ijz.me/?p=42 http://ijz.me/?p=42#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=42 本文载自:http://blog.chinaunix.net/u/29134/showart_480834.html

MYSQL5.0家族提供的性能跟踪器确实很爽。
要注意两点。
1、不过版本要在5.0.37之后

手册上介绍:(SHOW PROFILES and SHOW PROFILE were added in MySQL 5.0.37. )
Important
Please note that the SHOW PROFILE and SHOW PROFILES functionality is part of the MySQL 5.0 Community Server only.
2、变量profiling是用户变量,每次都得重新启用。


以下是我做的一些实验。数据很明显,就不多解释了。
mysql> use test
Database changed
mysql> set profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+—————-+

| Tables_in_test |
+—————-+

| bag_item |
| bag_user |
| score |
| t |
+—————-+

4 rows in set (0.03 sec)

mysql> select count(*) from t;
+———-+

| count(*) |
+———-+

| 2097152 |
+———-+

1 row in set (0.74 sec)

mysql> show profiles;
+———-+————+————————+
| Query_ID | Duration   | Query                  |
+———-+————+————————+
|     &nb103fsp;  1 | 0.02717000 | show tables            |
|        2 | 0.74770100 | select count(*) from t |
+———-+————+————————+
2 rows in set (0.00 sec)

mysql> show profile for query 2;
+——————————–+———-+
| Status                         | Duration |
+——————————–+———-+
| (initialization)               | 0.000004 |
| checking query cache for query | 0.000044 |
| Opening tables                 | 0.000012 |
| System lock                    | 0.000017 |
| Table lock                     | 0.00003 |
| init                           | 0.000013 |
| optimizing                     | 0.000008 |
| statistics                     | 0.000013 |
| preparing                      | 0.000011 |
| executing                      | 0.000006 |
| Sending data                   | 0.747313 |
| end                            | 0.000014 |
| query end                      | 0.000006 |
| storing result in query cache | 0.000006 |
| freeing items                  | 0.000012 |
| closing tables                 | 0.000009 |
| logging slow query             | 0.000183 |
+——————————–+———-+
17 rows in set (0.00 sec)

mysql> show profile block io,cpu for query 2;
+——————————–+———-+———-+————+————–+—————+
| Status                         | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+——————————–+———-+———-+————+————–+—————+
| (initialization)               | 0.000004 | 0        | 0          |            0 |             0 |
| checking query cache for query | 0.000044 | 0        | 0          |            0 |    &103fnbsp;        0 |
| Opening tables                 | 0.000012 | 0        | 0          |            0 |             0 |
| System lock                    | 0.000017 | 0        | 0          |            0 |             0 |
| Table lock                     | 0.00003 | 0        | 0          |            0 |             0 |
| init                           | 0.000013 | 0        | 0          |            0 |             0 |
| optimizing                     | 0.000008 | 0        | 0          |            0 |             0 |
| statistics                     | 0.000013 | 0        | 0          |            0 |             0 |
| preparing                      | 0.000011 | 0        | 0          |            0 |             0 |
| executing                      | 0.000006 | 0        | 0          |            0 |             0 |
| Sending data                   | 0.747313 | 0.746887 | 0          |            0 |             0 |
| end                            | 0.000014 | 0        | 0          |            0 |             0 |
| query end  &nb103fsp;                   | 0.000006 | 0        | 0          |            0 |             0 |
| storing result in query cache | 0.000006 | 0        | 0          |            0 |             0 |
| freeing items                  | 0.000012 | 0        | 0          |            0 |             0 |
| closing tables                 | 0.000009 | 0        | 0          |            0 |             0 |
| logging slow query             | 0.000183 | 0        | 0          |            0 |             0 |
+——————————–+———-+———-+————+————–+—————+
17 rows in set (0.00 sec)

mysql> insert into t(username) select username from t;
Query OK, 2097152 rows affected (34.17 sec)
Records: 2097152 Duplicates: 0 Warnings: 0

mysql> show profiles;
+———-+————-+————————————————+
| Query_ID | Duration    | Query                                          |
+———-+————-+————————————————+
|        1 | 0.02717000 | show tables                                    |
|        2 | 0.74770100 | select count(*) from t                         |
|        3 | 0.00004200 | show prifile for query 2                       |
|        4 | 34.30410100 | insert into t(username) select username from t |
+———-+————-+————————————————+
4 rows in set (0.00 sec)

mysql> show profile cpu,block io,memory,swaps for query 4;
+——————————+———–+———–+————+————–+—————+——-+
| Status                       | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | Swaps |
+——————————+———–+———–+————+————–+—————+——-+
| (initialization)             | 0.000038 | 0         | 0          |            0 |             0 |     0 |
| checking permissions         | 0.000016 | 0         | 0          |            0 |             0 |     0 |
| Opening tables               | 0.000014 | 0         | 0          |            0 |             0 |     0 |
| System lock                  | 0.000007 | 0         | 0          |            0 |             0 |     0 |
| Table lock                   | 0.000013 | 0         | 0          |            0 |             0 |     0 |
| init                         | 0.000015 | 0         | 0          |            0 |             0 |     0 |
| optimizing                   | 0.000006 | 0         | 0          |            0 |             0 |     0 |
| statistics                   | 0.000012 | 0         | 0          |            0 |             0 |     0 |
| preparing                    | 0.000011 | 0         | 0          |            0 |             0 |     0 |
| Creating tmp table           | 0.000029 | 0         | 0          |            0 |           &nbs103fp; 0 |     0 |
| executing                    | 0.000005 | 0         | 0          |            0 |             0 |     0 |
| Copying to tmp table         | 1.262877 | 1.24981   | 0.012998   |            0 |             0 |     0 |
| converting HEAP to MyISAM    | 0.384814 | 0.187971 | 0.19797    |            0 |             0 |     0 |
| Copying to tmp table on disk | 1.417069 | 1.203817 | 0.191971   |            0 |             0 |     0 |
| Sending data                 | 31.104185 | 13.965877 | 0.843872   |            0 |             0 |     0 |
| end                          | 0.000017 | 0         | 0          |            0 |             0 |     0 |
| removing tmp table           | 0.134872 | 0         | 0.029995   |            0 |             0 |     0 |
| end                          | 0.000026 | 0         | 0          |            0 |             0 |     0 |
| query end                    | 0.000006 | 0         | 0          |            0 |             0 |     0 |
| freeing items                | 0.000011 | 0         | 0          |            0 |             0 |     0 |
| closing tables               | 0.000009 | 0         | 0          |            0 |     &n103fbsp;       0 |     0 |
| logging slow query           | 0.000049 | 0         | 0          |            0 |             0 |     0 |
+——————————+———–+———–+————+————–+—————+——-+
22 rows in set (0.00 sec)

mysql> select count(*) from t;
+———-+
| count(*) |
+———-+
| 4194304 |
+———-+
1 row in set (1.51 sec)

]]>
http://ijz.me/?feed=rss2&p=42 0
oracle和 mysql的几点区别/zz/ http://ijz.me/?p=45 http://ijz.me/?p=45#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=45 Oracle数据库与MySQL数据库的区别是本文我们主要介绍的内容,希望能够对您有所帮助。

1.组函数用法规则

mysql中组函数在select语句中可以随意使用,但在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错

eg:

select name,count(money) from user;这个放在mysql中没有问题在oracle中就有问题了。

2.自动增长的数据类型处理

MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。

CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;

其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999

INSERT语句插入这个字段值为:序列号的名称.NEXTVAL

3.单引号的处理

MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

4.翻页的SQL语句的处理

MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数;PHP里还可以用SEEK定位到结果集的位置。ORACLE处理翻页的 SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80。

以下是经过分析后较好的两种ORACLE翻页SQL语句(ID是唯一关键字的字段名):

语句一:

SELECT ID, [FIELD_NAME,…] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

语句二:

SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,…] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

5.长字符串的处理

长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字 符串,请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和 超出长度字段值都应该提出警告,返回上次操作。

6.日期字段的处理

MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为 SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日24小时:分 钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式,可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)

日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE – 7;

MYSQL中插入当前时间的几个函数是:NOW()函数以`’YYYY-MM-DD HH:MM:SS’返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以 直接存到DATE字段中。CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())

而oracle中当前时间是sysdate

7.空字符的处理

MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

8.字符串的模糊比较

MYSQL里用字段名like%‘字符串%’,ORACLE里也可以用字段名like%‘字符串%’但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,‘字符串’)>0会得到更精确的查找结果。

9.程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。

]]>
http://ijz.me/?feed=rss2&p=45 0
php和mysql时间互换 http://ijz.me/?p=53 http://ijz.me/?p=53#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=53 在mysql中有三种时间字段类型:DATETIME,DATE和TIMESTAMP。DATETIME以YYYY-MM-DD HH:MM:SS格式的字符串来保存数据;DATE则是只有年月日以YYYY-MM-DD形式的字串;TIMESTAMP类型和PHP中的TIMESTAMP类型名字一样,但是两者基本上是不同的。PHP是延用了UNIX时间签的类型为一个整数,而在mysql中TIMESTAMP字段则是随着记录变化而一个自动更新为当时时间的DATETIMP字段。在mysql4.1版本之后TIMESTAMP格式DATETIME格式基本上是一致了。

于是常常需要在php和msql中对两种格式的Timestamp进行转换。转换方法总结一下:

第一种方法:使用 date()和strtotime()函数

$mysqltime=date(‘Y-m-d H:i:s’,$phptime);

$phptime=strtotime($mysqldate);

第二种方法:在查询语句中使用mysql函数转换:UNIX_TIMESTAMP(DATETIME=>PHP TIMESTAMP)和FROM_UNIXTIME(PHP TIMESTAMP=>DATETIME).

$sql=”SELECT UNIX_TIMESTAMP(datetimefield) FROM table WHERE …”;

$sql=”UPDATE table set datetimefield=FROM_UNIXTIME($phptime) WHERE ..”;

第三种方法:就是mysql中使用整数字段来保存php的timestamp类型。

]]>
http://ijz.me/?feed=rss2&p=53 0
总结MYSQL的优化/zz/ http://ijz.me/?p=122 http://ijz.me/?p=122#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=122 本文载自:http://blog.chinaunix.net/u/29134/showart_264480.html

1.数据库的设计
尽量把数据库设计的更小的占磁盘空间.
1).尽可能使用更小的整数类型.(mediumint就比int更合适).
2).尽可能的定义字段为not null,除非这个字段需要null.(这个规则只适合字段为KEY的情形)
3).如果没有用到变长字段的话比如varchar,那就采用固定大小的纪录格式比如char.(CHAR 总是比VARCHR快)


4).表的主索引应该尽可能的短.这样的话每条纪录都有名字标志且更高效.
5).只创建确实需要的索引。索引有利于检索记录,但是不利于快速保存记录。如果总是要在表的组合字段上做搜索,那么就在这些字段上创建索引。索引的第一部分必须是最常使用的字段.如果总是需要用到很多字段,首先就应该多复制这些字段,使索引更好的压缩。
(这条只适合MYISAM引擎的表,对于INNODB则在保存记录的时候关系不大,因为INNODB是以事务为基础的,如果想快速保存记录的话,特别是大批量的导入记录的时候)
6).所有数据都得在保存到数据库前进行处理。
7).所有字段都得有默认值。
8).在某些情况下,把一个频繁扫描的表分成两个速度会快好多。在对动态格式表扫描以取得相关记录时,它可能使用更小的静态格式表的情况下更是如此。
(具体的表现为:MYISAM表的MERGE103f类型,以及MYISAM和INNODB通用的分区,详情见手册)
9).不会用到外键约束的地方尽量不要使用外键。
2.系统的用途
1).及时的关闭对MYSQL的连接。
2).explain 复杂的SQL语句。(这样能确定你的SELECT 语句怎么优化最佳)
3).如果两个关联表要做比较话,做比较的字段必须类型和长度都一致.(在数据庞大的时候建立INDEX)
4).LIMIT语句尽量要跟order by或者 distinct.这样可以避免做一次full table scan.
5).如果想要清空表的所有纪录,建议用truncate table tablename而不是delete from tablename.
不过有一个问题,truncate 不会在事务处理中回滚。因为她要调用create table 语句。
(Truncate Table 语句先删除表然后再重建,这个是属于文件界别的,所以自然快N多)
实测例子:
song2为INNODB表。
mysql> select count(1) from song2;
+———-+
| count(1) |
+———-+
|   500000 |
+———-+
1 row in set (0.91 sec)

mysql> delete from song2;
Query OK, 500000 rows affected (15.70 sec)
mysql> truncate table song2;
Query OK, 502238 rows affected (0.17 sec)

mysql>
{
这一点手册上有详细解释:

13.2.9. TRUNCATE语法TRUNCATE [TABLE] tbl_name

TRUNCATE TABLE用于完全清空一个表。从逻辑上说,该语句与用于删除所有行的DELETE语句等同,但是在有些情况下,两者在使用上有所不同。

对于InnoDB表,如果有需要引用表的外键限制,则TRUNCATE TABLE被映射到DELETE上;否则使用快速删减(取消和重新创建表)。使用TRUNCATE TABLE重新设置AUTO_INCREMENT计数器,设置时不考虑是否有外键限制。

对于其它存储引擎,在MySQL 5.1中,TRUNCATE TABLE与DELETE FROM有以下几处不同:

·         删减操作会取消并重新创建表,这比一行一行的删除行要快很多。

·         删减操作不能保证对事务是安全的;在进行事务处理和表锁定的过程中尝试进行删减,会发生错误。

·         被删除的行的数目没有被返回。

·         只要表定义文件tbl_name.frm是合法的,则可以使用TRUNCATE TABLE把表重新创建为一个空表,即使数据或索引文件已经被破坏。

·         表管理程序不记得最后被使用的AUTO_INCREMENT值,但是会从头开始计数。即使对于MyISAM和InnoDB也是如此。MyISAM和InnoDB通常不再次使用序列值。

·         当被用于带分区的表时,TRUNCATE TABLE会保留分区;即,数据和索引文件被取消并重新创建,同时分区定义(.par)文件不受影响。

TRUNCATE TABLE是在MySQL中采用的一个Oracle SQL扩展。


}
6).能使用STORE PROCEDURE 或者 USER FUNCTION的时候.(ROUTINE总是减少了服务器端的开销)
7).在一条insert语句中采用多重纪录插入格式.而且使用load data infile来导入大量数据,这比单纯的indert快好多.(在MYSQL中具体表现为:INSERT INTO TABLEQ VALUES (),(),…();)
(还有就是在MYISAM表中插入大量记录的时候先禁用到KEYS后面再建立KEYS,具体表现语句:
ALTER TABLE TABLE1 DISABLE KEYS;ALTER TABLE TABLE1 ENABLE KEYS103f;
而对于INNNODB 表在插入前先 set autocommit=0;完了后:set autocommit=1;这样效率比较高。)
8).经常OPTIMIZE TABLE 来整理碎片.
9).还有就是date 类型的数据如果频繁要做比较的话尽量保存在unsigned int 类型比较快。
3.系统的瓶颈
1).磁盘搜索.
并行搜索,把数据分开存放到多个磁盘中,这样能加快搜索时间.
2).磁盘读写(IO)
可以从多个媒介中并行的读取数据。
3).CPU周期
数据存放在主内存中.这样就得增加CPU的个数来处理这些数据。
4).内存带宽
当CPU要将更多的数据存放到CPU的缓存中来的话,内存的带宽就成了瓶颈.

]]>
http://ijz.me/?feed=rss2&p=122 0
/zz/MySQL 字符串函数:字符串截取 http://ijz.me/?p=10 http://ijz.me/?p=10#respond Fri, 29 Nov 2013 16:00:00 +0000 http://ijz.me/?p=10 MySQL 字符串截取函数:left(), right(), substring(), substring_index()。还有 mid(), substr()。其中,mid(), substr() 等价于 substring() 函数,substring() 的功能非常强大和灵活。

1. 字符串截取:left(str, length)

mysql> select left(‘sqlstudy.com’, 3);+————————-+| left(‘sqlstudy.com’, 3) |+————————-+| sql |+————————-+

2. 字符串截取:right(str, length)

mysql> select right(‘sqlstudy.com’, 3);+————————–+| right(‘sqlstudy.com’, 3) |+————————–+| com |+————————–+

3. 字符串截取:substring(str, pos); substring(str, pos, len)

3.1 从字符串的第 4 个字符位置开始取,直到结束。

mysql> select substring(‘sqlstudy.com’, 4);+——————————+| substring(‘sqlstudy.com’, 4) |+——————————+| study.com |+——————————+

3.2 从字符串的第 4 个字符位置开始取,只取 2 个字符。

mysql> select substring(‘sqlstudy.com’, 4, 2);+———————————+| substring(‘sqlstudy.com’, 4, 2) |+———————————+| st |+———————————+

3.3 从字符串的第 4 个字符位置(倒数)开始取,直到结束。

mysql> select substring(‘sqlstudy.com’, -4);+——————————-+| substring(‘103fsqlstudy.com’, -4) |+——————————-+| .com |+——————————-+

3.4 从字符串的第 4 个字符位置(倒数)开始取,只取 2 个字符。

mysql> select substring(‘sqlstudy.com’, -4, 2);+———————————-+| substring(‘sqlstudy.com’, -4, 2) |+———————————-+| .c |+———————————-+

我们注意到在函数 substring(str,pos, len)中, pos 可以是负值,但 len 不能取负值。

4. 字符串截取:substring_index(str,delim,count)

4.1 截取第二个 ‘.’ 之前的所有字符。

mysql> select substring_index(‘www.sqlstudy.com.cn’, ‘.’, 2);+————————————————+| substring_index(‘www.sqlstudy.com.cn’, ‘.’, 2) |+————————————————+| www.sqlstudy |+————————————————+

4.2 截取第二个 ‘.’ (倒数)之后的所有字符。

mysql> select substring_index(‘www.sqlstudy.com.cn’, ‘.’, -2);+————————————————-+| substring_index(‘www.sqlstudy.com.cn’, ‘.’, -2) |+————————————————-+| com.cn |+————————————————-+

4.3 如果在字符串中找不到 delim 参数指定的值,就返回整个字符串

mysql> select substring_index(‘www.sqlstudy.com.cn’, ‘.coc’, 1);+—————————————————+| substring_index(‘www.sqlstudy.com.cn’, ‘.coc’, 1) |+—————————————————+| www.sqlstudy.com.cn |+—————————————————+

]]>
http://ijz.me/?feed=rss2&p=10 0