RSS
 

Mysql 加減時間函數

23 四月

date_add

set @dt = now();
select date_add(@dt, interval 1 day);   - 加1天
select date_add(@dt, interval 1 hour);   -加1小时
select date_add(@dt, interval 1 minute);    - 加1分钟

可選參數還可以為 second microsecond week month quarter year

date_sub
用法與 date_add 一樣

計算時間差
datediff(date1,date2):两个日期相减 date1 date2,返回天数。

select datediff('2008-08-08', '2008-08-01');

timediff(time1,time2):两个日期相减 time1 time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00');
 
 

[轉載][图解] 11招教你如何玩转数据库设计

17 四月

Rule 1:弄清(OLTP或OLAP)应用的本质是什么?

当开始制作数据表单设计时,首先,要分析你设计的这个程序的本质是什么?是事务性还是分析性的?你会发现许多开发者会默认应用常规化规则,随后才考虑性能问题而不考虑应用的本质。

关于事务性和分析性,一起来看下两者区别。

Transactional:这种应用,用户对CRUD较为感兴趣,即创建、读取、更新和删除记录。这种数据,官方名称之位OLTP。

Analytical:用户对分析、报告、预测等方面感兴趣。这类数据库很少有嵌入和更新。主要目的是为了尽快获取和分析数据。官方名称之为OLAP。 Read the rest of this entry »

 
 

ZendCache Sqlite作為緩存網站應用

28 三月

以前介紹過Sqlite的簡介。特點小巧、快速,在數量很少的時候性能很出色、佔用內存很小。

最近有使用ZendCache (Zend Framework的一個模組) 來做網站的緩存,

由於網站導航條、付導航條、Footer、城市列表、都是通過數據庫查詢出來的。基本上每頁都顯示,所以使用了緩存技術。

ZendCache的單獨使用

由於只是用ZendCache部分所以,只要copy ~/zend/Cache 目錄以及 ~/zend/Exception.php ~/zend/Cache.php兩個文件就可以了。

性能方面的提升

使用後有0.27秒提升到0.19秒。

其他的緩存方式

ZendCache 還有 File 、 Apc、Memcached、XCache 等選擇。

由於緩存數據少 Sqlite 和 File 緩存 基本上沒什麼區別。

Apc、Memcached、XCache 為內存緩存 性能提升會更快。但要求Server支持。

使用會比不使用緩存性能更優。內存存儲更加。

 

Mysql忘記Root密碼

09 三月

如果您忘記了Mysql的root密碼,可以用命令跳過權限驗證來修改root密碼。前提是擁有主機的root密碼

1. 停止mysqld;
/etc/init.d/mysql stop
(您可能有其它的方法,总之停止mysqld的运行就可以了)

2. 用以下命令启动MySQL,以不检查权限的方式启动;
mysqld –skip-grant-tables &
3. 然后用空密码方式使用root用户登录 MySQL;
mysql -u root
4. 修改root用户的密码;
mysql> update mysql.user set password=PASSWORD(‘newpassword’) where User=’root’;
mysql> flush privileges;
mysql> quit
重新启动MySQL
/etc/init.d/mysql restart
就可以使用新密码 newpassword 登录了。

 
 

Mysql全文索引

06 三月

MySQL支持全文索引和搜索功能。 MySQL中的全文索引类型FULLTEXT的索引。 FULLTEXT 索引仅可用于 MyISAM 表。

為了支持中文 在my.ini文件中找到 [mysqld],在其下方加入ft_min_word_len=1 。默認值為4,必須該為1,否則中文不能匹配。

創建一個全文索引

ALTER TABLE  `whois` ADD FULLTEXT (
`company_cn` ,
`addr1_cn`
);

簡單的查詢

SELECT *
FROM  `whois`
WHERE MATCH (company_cn, addr1_cn)
AGAINST ('Intergroup Technology')
LIMIT 0 , 30

MySQL 使用一个非常简单的剖析器来将文本分隔成词。一个“词”是由文字、数据、“’” 和 “_” 组成的任何字符序列。任何在 stopword 列表上出现的,或太短的(3 个字符或更少的)的 “word” 将被忽略。

在集和查询中的每个合适的词根据其在集与查询中的重要性衡量。这样,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重。然后,词的权重将被结合用于计算记录行的相似性。

这样一个技术工作可很好地工作与大的集(实际上,它会小心地与之谐调)。 对于非常小的表,词分类不足以充份地反应它们的语义值,有时这个模式可能产生奇怪的结果。

使用時注意事項

  • 只支持MyISAM 格式的表。
  • 對中文支持不好,默認情況下四個中文字才能搜索到結果。(可以安裝一些插件解決)
  • 任何过于短的词都会被忽略。 全文搜索所能找到的词的默认最小长度为 4个字符。
    停止字中的词会被忽略。禁用词就是一个像“the” 或“some” 这样过于平常而被认为是不具语义的词。存在一个内置的停止字, 但它可以通过用户自定义列表被改写
  • 50%規則,也就是說當一個字或詞出現的次數超過50% 就會被忽略。所以數據越多越好
 
 

MongoDB–分佈式文檔存儲數據庫

15 二月

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  • 面向集合存储,易存储对象类型的数据。
  • 模式自由。
  • 支持动态查询。
  • 支持完全索引,包含内部对象。
  • 支持查询。
  • 支持复制和故障恢复。
  • 使用高效的二进制数据存储,包括大型对象(如视频等)。
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
  • 文件存储格式为BSON(一种JSON的扩展)
  • 可通过网络访问

MongoDB 是Nosql的一種實現, NoSql的特點他幾乎都具備。

在MongoDB中,数据以JSON(JavaScript Object Notation)格式存储,当插入一个对象时,需要构建一个JSON对象;当查询时,返回的数据也为一个JSON对象,等等。

下面是插入查詢排序的例子

db.users.insert({attr2: 4, attr3: 5})

db.users.insert( { _id : "alex", name: { first:"Alex", last:"Benisson" },
    karma : 1.0 } )

db.users.find({})
db.users.find({'last_name': 'Smith'})

// retrieve ssn field for documents where last_name == 'Smith':
db.users.find({last_name: 'Smith'}, {'ssn': 1});

// retrieve all fields *except* the thumbnail field, for all documents:
db.users.find({}, {thumbnail:0});

db.users.find({}).sort({last_name: 1});

db.users.find().skip(20).limit(10);
 

Mysql 加密

01 二月

如果你使用的正是mysql数据库,那么你把密码或者其他敏感重要信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取 是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者破坏应用程序,同时还要保证您的竞争优势。幸运的是,MySQL带有很多设计用来提供这 种类型安全的加密函数。本文概述了其中的一些函数,并说明了如何使用它们,以及它们能够提供的不同级别的安全。
双向加密
就让我们从最简单的加密开始:双向加密。在这里,一段数据通过一个密钥被加密,只能够由知道这个密钥的人来解密。MySQL有两个函数来支持这种类型的加密,分别叫做ENCODE()和DECODE()。下面是一个简单的实例:

注意:由於加密後是二進制 所以字段欄位應該存儲為BLOB类型

INSERT INTO users (username, password) 
VALUES ('joe', ENCODE('guessme', 'abracadabra'));

其中,Joe的密码是guessme,它通过密钥abracadabra被加密。要注意的是,加密完的结果是一个二进制字符串,如下所示:

mysql# SELECT * FROM users WHERE username='joe';
+----------+----------+
| username | password |
+----------+----------+
| joe | ??i??!? |
+----------+----------+
1 row in set (0.02 sec)

abracadabra这个密钥对于恢复到原始的字符串至关重要。这个密钥必须被传递给DECODE()函数,以获得原始的、未加密的密码。下面就是它的使用方法:

mysql# SELECT DECODE(password, 'abracadabra')
FROM users WHERE username='joe';
+---------------------------------+
| DECODE(password, 'abracadabra') |
+---------------------------------+
| guessme |
+---------------------------------+
1 row in set (0.00 sec)

应该很容易就看到它在Web应用程序里是如何运行的——在验证用户登录的时候,DECODE()会用网站专用的密钥解开保存在数据库里的密码,并和用户输入的内容进行对比。假设您把PHP用作自己的脚本语言,那么可以像下面这样进行查询:

<?php
$query = "SELECT COUNT(*)
FROM users
WHERE  username='$inputUser'
AND DECODE(password,  'abracadabra') = '$inputPass'";
?>
 
No Comments

Posted in Mysql

 

Mysql PROCEDURE ANALYSE 建議

03 一月

PROCEDURE ANALYSE() 会让 MySQL 帮你去分析你的字段和其实际的数据,并会给你一些有用的建议。只有表中有实际的数据,这些建议才会变得有用,因为要做一些大的决定是需要有数据作为基础的。

例如,如果你创建了一个 INT 字段作为你的主键,然而并没有太多的数据,那么,PROCEDURE ANALYSE()会建议你把这个字段的类型改成 MEDIUMINT 。或是你使用了一个 VARCHAR 字段,因为数据不多,你可能会得到一个让你把它改成 ENUM 的建议。这些建议,都是可能因为数据不够多,所以决策做得就不够准。

以下是一個例子:

mysql> select * from account PROCEDURE ANALYSE(1)\G;
*************************** 1. row ***************************
             Field_name: howard_name080.account.id
              Min_value: 1
              Max_value: 1966
             Min_length: 1
             Max_length: 4
       Empties_or_zeros: 0
                  Nulls: 0
Avg_value_or_avg_length: 983.5000
                    Std: 567.5352
      Optimal_fieldtype: SMALLINT(4) UNSIGNED NOT NULL
*************************** 2. row ***************************
             Field_name: howard_name080.account.no
              Min_value: 9922860
              Max_value: 9922869
             Min_length: 14
             Max_length: 14
       Empties_or_zeros: 0
                  Nulls: 0
Avg_value_or_avg_length: 14.0000
                    Std: NULL
      Optimal_fieldtype: CHAR(14) NOT NULL
*************************** 3. row ***************************
             Field_name: howard_name080.account.sid
              Min_value: 1
              Max_value: 3274
             Min_length: 1
             Max_length: 4
       Empties_or_zeros: 588
                  Nulls: 0
Avg_value_or_avg_length: 1181.2457
                    Std: 1152.3210
      Optimal_fieldtype: SMALLINT(4) UNSIGNED NOT NULL
*************************** 4. row ***************************
             Field_name: howard_name080.account.state
              Min_value: failed
              Max_value: ok
             Min_length: 2
             Max_length: 6
       Empties_or_zeros: 0
                  Nulls: 0
Avg_value_or_avg_length: 2.3642
                    Std: NULL
      Optimal_fieldtype: ENUM('failed','mailed','new','ok') NOT NULL
 
No Comments

Posted in Mysql

 

Mysql Prepared Statements (預查詢)

21 十二月

兩個ORM(Doctrine)查詢語句例子

 $q = Doctrine_Query::create()
 ->from('PdoMember')
 ->where("member_name like ?", '%howard%')
 ->orderBy('mid desc');

$q = Doctrine_Query::create()
 ->from('PdoMember')
 ->where("member_name like '%howard%'")
 ->orderBy('mid desc');
 

這兩個達到的是一樣的效果,但生成的SQL語句不同

Select * FROM member m WHERE (m.member_name like ?) ORDER BY m.mid desc

Select * FROM member m WHERE (m.member_name like '%howard%') ORDER BY m.mid desc

第一個是 使用了Prepared Statements (預查詢)。

prepared statement是什麼?

Prepared statement 可以讓你在第一次執行時sql時,先設定sql敘述,讓以後相同的sql,只要帶入不同的參數,就重複執行相同的sql,而不用每次執行相同的sql時都讓伺服器耗費時間設定sql敘述。

特性

  • 安全性 — 檢查傳遞變量的值
  • 快速 — 執行同一個類似語句的時候 不用在編譯Sql語句,只要傳遞變量即可。
  • 不能使用查詢緩存

完整的Msql語句

set @query='select * from people where name=? And sex=?';
prepare stmt from @query;
set @name='Hi'; 
set @sex='f'; execute stmt using @name,@sex;
 
No Comments

Posted in Mysql

 

php連接Mysql相關術語

14 十二月

一、php_mysql

最原始的,連接方式。最早支持的連接mysql的方式。

二、php_mysqli

mysql是非持继连接函数而mysqli是永远连接函数。也就是说mysql每次链接都会打开一个连接的进程而mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。性能要好。

三、pdo_mysql

是用類的形式交換Sql服務器。且統一了不同數據庫的接口。php連接數據庫的函數是混亂的。pdo則改變了這種情況。性能要比 php_mysql 好。 與 php_mysqli基本一致。php5開始支持。

mysqlnd

這個不能說是一個連接方式。因為php_mysql php_mysqli pdo_mysql在php5.3之前調用的是libmysql來執行SQL語句。libmysql是Mysql(現在是Oracle公司)開發的,且存在版權問題。mysqlnd是php團隊開發的連接mysql的底層交互層。更有效的使用內存。 速度更優。

 
 
第 1 页,共 3 页123