mysql

文章目录

    Quick Links

    高效的 MySQL GUI 工具

    • Ubuntu 上的 MySQL Workbench

    GRANT PRIVILEGE

    $ mysql -u root -p
    > GRANT SELECT ON db_test.table_test TO 'user_test'@'%' IDENTIFIED BY 'password';
    

    or

    > CREATE DATABASE db_test;
    > GRANT ALL PRIVILEGES ON db_test.* TO 'user_test'@'localhost' IDENTIFIED BY 'password';
    

    对于 foreign key 是否需要手动建索引

    MySQL 的 innodb 会帮你自动创建的。

    参考
    * http://stackoverflow.com/questions/304317/does-mysql-index-foreign-key-columns-automatically

    ubuntu 关闭 mysql 服务

    • 关闭 sudo service mysql stop
    • 启动 sudo service mysql start

    当列数较多时,将 mysql console 里的查询结果竖着排列展示

    mysql> select * from quotes order by id desc limit 1 \G
    
    *************************** 1. row ***************************
             id: 1001 
       quote_id: 76b84568-fa95-11e1-90d3-0819a6248970
            tag: running
         author: zhongwei
    

    查看已创建的用户及权限

    > SELECT User FROM mysql.user;
    > SHOW GRANTS FOR 'account'@'localhost';
    

    注意,如果只指定用户名的话,默认是 ‘%’ 而不是 localhost。

    所以当运维或者 DBA 给我们开通了权限后,我们第一件事情就是确认权限是否完全开通.
    通常生产环境的 mysql 是限制用户的访问 IP 的,所以需要将 localhost 替换为自己的 IP。

    参考:

    使用 MySQL 存储 schema-less 数据的探索

    table design:

    表结构做成 id, key, value 还是 key, value 比较好。

    按照 Bret Taylor 的分享,比较好的设计是

    • added_id -> INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    • id -> UNIQUE KEY
    • updated -> KEY
    • body -> json

    之所以加上自增的 added_id, 是因为 Mysql InnoDB 是按照主键顺序在磁盘上顺序存储
    数据的。这样就能保证新数据总是能写在旧数据的后面,因为新数据读取的频率总会高于
    旧数据,磁头不会波动太大。

    e.g.

    CREATE TABLE entities (
        added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        id CHAR(32) NOT NULL,
        updated DATETIME NOT NULL,
        body MEDIUMBLOB,
        UNIQUE KEY (id),
        KEY (updated)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    notes:

    • id -> uuid4.hex

    参考:

    在 mysql console 里执行 sql 文件里语句

    mysql> source file_name.sql
    

    参考:

    遍历一张数据表

    c.execute("SELECT * FROM tbl_subscriber LIMIT %i,%i;", (actualLimit,steps))
    

    产看表的索引

    show create table <table_name>;
    

    INT(12) 与 INT(8) 的区别

    存储上无区别,主要是在终端下显示的区别。
    主要是用在和 ZEROFILL 的组合使用上,用于设置显示时用于添零的长度。

    参考

    • http://stackoverflow.com/questions/1632403/what-is-the-difference-when-being-applied-to-my-code-between-int10-and-int1/1632567#1632567

    修改表结构

    alter table tbl_name add column coln_name varchar(30) AFTER coln_name

    最好的方法是使用 GUI 工具, 在图形界面上修改,将生成的语句再备份到文本里,以方
    便在服务器上执行。例如,MySQL Workbench.

    install MySQL on CentOS

    yum install mysql-server

    mysql enable remote access

    /etc/mysql/my.cnf

    bind-address = 127.0.0.1

    各种 Join 的区别

    http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-joins

    一行流统计 SQL

    SELECT 
    	NOW() AS cur_time,
    	(select count(1) FROM amazon_com.categories) as total_categories,
    	(select count(1) from amazon_com.items) as total_asin,
    	(select count(1) from amazon_com.items where crawl_status = 1) as 'processed_items',
        (select count(1) from amazon_com.categories where processed_children = 0) as 'unprocessed_children_categories',
        (select count(1) from amazon_com.categories where status = 1) as 'processed_categories',
        (select count(1) from amazon_com.items where crawl_status = 3) as 'unfound_items',
        (select count(1) from amazon_com.items where crawl_status = 5) as 'inqueue_items',
        (select count(1) from amazon_com.items where crawl_status = 4) as 'invalid_items';
    

    运行 MySQL 远程访问

    GRANT ALL PRIVILEGES ON *.* TO 'my_user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

    生成一个新用户,允许远程访问,root 的远程访问一定要禁掉。

    参考 How to allow remote connection to mysql

    导出当前 MySQL 所有数据库

    mysqldump -u root -p --all-databases > alldb.sql
    

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式