简体   繁体   English

PostgreSQL在PHP上的简单连接和查询方面略显缓慢

[英]PostgreSQL slightly slow in simple connection and query on PHP

In PHP 5.4.1 i am using native PostgreSQL driver to connect to the SQL server. 在PHP 5.4.1中,我使用本机PostgreSQL驱动程序连接到SQL服务器。 Even if i try the PDO way it is the same. 即使我尝试PDO方式也是如此。 Only one exception here. 这里只有一个例外。 If i use pg_pconnect (persistent) it is very fast as i expected. 如果我使用pg_pconnect(持久性),它就像我预期的那样快。

My Connection from PHP to PostgreSQL is slow. 我从PHP到PostgreSQL的连接速度很慢。 Also, some queries are slow too. 此外, 一些查询也很慢。

For example please take a look at this table. 例如,请看一下这张表。

id  type    active  serverip
1   1   0   127.0.0.1
2   10  1   127.0.0.1
3   4   1   127.0.0.1
4   7   1   127.0.0.1
5   13  1   127.0.0.1
6   2   1   127.0.0.1
7   11  1   127.0.0.1
8   6   1   127.0.0.1
9   9   1   127.0.0.1
10  3   0   192.168.1.202
11  5   1   127.0.0.1
12  8   1   127.0.0.1
13  12  1   127.0.0.1
14  14  1   127.0.0.1

My query is select * from mytable order by id desc . 我的查询是select * from mytable order by id desc So, 所以,

This table has index and primary key on id . 该表在id上有索引和主键。 This table is in MySQL 5.5.23 and on PostgreSQL 9.1.3 as same (1:1) 该表在MySQL 5.5.23中和PostgreSQL 9.1.3上相同(1:1)

MySQL connects this database and read this table (whole data) in 0.0019 sec. MySQL连接此数据库并在0.0019 sec.读取此表(整个数据) 0.0019 sec. But PostgreSQL takes 0.0069 sec . PostgreSQL需要0.0069 sec This may seen as usual but if MySQL can do this in very fast why not PostgreSQL? 这可能与往常一样,但如果MySQL可以非常快地执行此操作,为什么不使用PostgreSQL?

In my large tables it takes too longer than this. 在我的大表中,它需要比这更长的时间。 In large table MySQL connect and fetch in 0.09601 sec, PostgreSQL connect and fetch it in 0.11260 sec 0.14201 sec. 在大表MySQL连接和获取0.09601 sec, PostgreSQL连接并在 0.11260秒 0.14201 sec.获取它0.14201 sec. (tested now) (现在测试)

As you can see, in this very simple database table PostgreSQL simply slow. 正如您所看到的,在这个非常简单的数据库表中,PostgreSQL只是很慢。 This is my postgresql.conf file: 这是我的postgresql.conf文件:

    listen_addresses = '*'      # what IP address(es) to listen on;
                    # comma-separated list of addresses;
                    # defaults to 'localhost', '*' = all
                    # (change requires restart)
port = 5432             # (change requires restart)
max_connections = 100           # (change requires restart)
# Note:  Increasing max_connections costs ~400 bytes of shared memory per
# connection slot, plus lock space (see max_locks_per_transaction).
#superuser_reserved_connections = 3 # (change requires restart)
#unix_socket_directory = ''     # (change requires restart)
#unix_socket_group = ''         # (change requires restart)
#unix_socket_permissions = 0777     # begin with 0 to use octal notation
                    # (change requires restart)
#bonjour = off              # advertise server via Bonjour
                    # (change requires restart)
#bonjour_name = ''          # defaults to the computer name
                    # (change requires restart)

# - Security and Authentication -

authentication_timeout = 20s        # 1s-600s
ssl = off               # (change requires restart)
#ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH'  # allowed SSL ciphers
                    # (change requires restart)
#ssl_renegotiation_limit = 512MB    # amount of data between renegotiations
#password_encryption = on
#db_user_namespace = off

# Kerberos and GSSAPI
#krb_server_keyfile = ''
#krb_srvname = 'postgres'       # (Kerberos only)
#krb_caseins_users = off

# - TCP Keepalives -
# see "man 7 tcp" for details

#tcp_keepalives_idle = 0        # TCP_KEEPIDLE, in seconds;
                    # 0 selects the system default
#tcp_keepalives_interval = 0        # TCP_KEEPINTVL, in seconds;
                    # 0 selects the system default
#tcp_keepalives_count = 0       # TCP_KEEPCNT;
                    # 0 selects the system default


#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------

# - Memory -

shared_buffers = 1GB            # min 128kB
                    # (change requires restart)
temp_buffers = 16MB         # min 800kB
max_prepared_transactions = 0       # zero disables the feature
                    # (change requires restart)
# Note:  Increasing max_prepared_transactions costs ~600 bytes of shared memory
# per transaction slot, plus lock space (see max_locks_per_transaction).
# It is not advisable to set max_prepared_transactions nonzero unless you
# actively intend to use prepared transactions.
work_mem = 64MB             # min 64kB
maintenance_work_mem = 32MB     # min 1MB
max_stack_depth = 8MB           # min 100kB

# - Kernel Resource Usage -

max_files_per_process = 1000        # min 25
                    # (change requires restart)
shared_preload_libraries = ''       # (change requires restart)

# - Cost-Based Vacuum Delay -

vacuum_cost_delay = 0ms     # 0-100 milliseconds
vacuum_cost_page_hit = 100      # 0-10000 credits
vacuum_cost_page_miss = 100     # 0-10000 credits
vacuum_cost_page_dirty = 200        # 0-10000 credits
vacuum_cost_limit = 2000        # 1-10000 credits

# - Background Writer -

bgwriter_delay = 200ms          # 10-10000ms between rounds
bgwriter_lru_maxpages = 100     # 0-1000 max buffers written/round
bgwriter_lru_multiplier = 2.0       # 0-10.0 multipler on buffers scanned/round

# - Asynchronous Behavior -

#effective_io_concurrency = 1       # 1-1000. 0 disables prefetching


#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------

# - Settings -

#wal_level = minimal            # minimal, archive, or hot_standby
                    # (change requires restart)
#fsync = on             # turns forced synchronization on or off
#synchronous_commit = on        # synchronization level; on, off, or local
#wal_sync_method = fsync        # the default is the first option
                    # supported by the operating system:
                    #   open_datasync
                    #   fdatasync (default on Linux)
                    #   fsync
                    #   fsync_writethrough
                    #   open_sync
#full_page_writes = on          # recover from partial page writes
#wal_buffers = -1           # min 32kB, -1 sets based on shared_buffers
                    # (change requires restart)
#wal_writer_delay = 200ms       # 1-10000 milliseconds

commit_delay = 0            # range 0-100000, in microseconds
commit_siblings = 5         # range 1-1000

# - Checkpoints -

#checkpoint_segments = 3        # in logfile segments, min 1, 16MB each
#checkpoint_timeout = 5min      # range 30s-1h
#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
#checkpoint_warning = 30s       # 0 disables

# - Archiving -

#archive_mode = off     # allows archiving to be done
                # (change requires restart)
#archive_command = ''       # command to use to archive a logfile segment
#archive_timeout = 0        # force a logfile segment switch after this
                # number of seconds; 0 disables


#------------------------------------------------------------------------------
# REPLICATION
#------------------------------------------------------------------------------

# - Master Server -

# These settings are ignored on a standby server

#max_wal_senders = 0        # max number of walsender processes
                # (change requires restart)
#wal_sender_delay = 1s      # walsender cycle time, 1-10000 milliseconds
#wal_keep_segments = 0      # in logfile segments, 16MB each; 0 disables
#vacuum_defer_cleanup_age = 0   # number of xacts by which cleanup is delayed
#replication_timeout = 60s  # in milliseconds; 0 disables
#synchronous_standby_names = '' # standby servers that provide sync rep
                # comma-separated list of application_name
                # from standby(s); '*' = all

# - Standby Servers -

# These settings are ignored on a master server

#hot_standby = off          # "on" allows queries during recovery
                    # (change requires restart)
#max_standby_archive_delay = 30s    # max delay before canceling queries
                    # when reading WAL from archive;
                    # -1 allows indefinite delay
#max_standby_streaming_delay = 30s  # max delay before canceling queries
                    # when reading streaming WAL;
                    # -1 allows indefinite delay
#wal_receiver_status_interval = 10s # send replies at least this often
                    # 0 disables
#hot_standby_feedback = off     # send info from standby to prevent
                    # query conflicts


#------------------------------------------------------------------------------
# QUERY TUNING
#------------------------------------------------------------------------------

# - Planner Method Configuration -

enable_bitmapscan = on
enable_hashagg = on
enable_hashjoin = on
enable_indexscan = on
enable_material = on
enable_mergejoin = on
enable_nestloop = on
enable_seqscan = on
enable_sort = on
enable_tidscan = on

# - Planner Cost Constants -

seq_page_cost = 1.0         # measured on an arbitrary scale
random_page_cost = 4.0          # same scale as above
cpu_tuple_cost = 0.01           # same scale as above
cpu_index_tuple_cost = 0.005        # same scale as above
cpu_operator_cost = 0.0025      # same scale as above
effective_cache_size = 512MB

# - Genetic Query Optimizer -

geqo = on
geqo_threshold = 12
geqo_effort = 5         # range 1-10
geqo_pool_size = 0          # selects default based on effort
geqo_generations = 0            # selects default based on effort
geqo_selection_bias = 2.0       # range 1.5-2.0
geqo_seed = 0.0         # range 0.0-1.0

# - Other Planner Options -

#default_statistics_target = 100    # range 1-10000
#constraint_exclusion = partition   # on, off, or partition
#cursor_tuple_fraction = 0.1        # range 0.0-1.0
#from_collapse_limit = 8
#join_collapse_limit = 8        # 1 disables collapsing of explicit
                    # JOIN clauses


#------------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING
#------------------------------------------------------------------------------

# - Where to Log -

log_destination = 'stderr'      # Valid values are combinations of
                    # stderr, csvlog, syslog, and eventlog,
                    # depending on platform.  csvlog
                    # requires logging_collector to be on.

# This is used when logging to stderr:
logging_collector = on          # Enable capturing of stderr and csvlog
                    # into log files. Required to be on for
                    # csvlogs.
                    # (change requires restart)

# These are only used if logging_collector is on:
log_directory = 'pg_log'        # directory where log files are written,
                    # can be absolute or relative to PGDATA
log_filename = 'postgresql-%a.log'  # log file name pattern,
                    # can include strftime() escapes
log_file_mode = 0777            # creation mode for log files,
                    # begin with 0 to use octal notation
log_truncate_on_rotation = on       # If on, an existing log file with the
                    # same name as the new log file will be
                    # truncated rather than appended to.
                    # But such truncation only occurs on
                    # time-driven rotation, not on restarts
                    # or size-driven rotation.  Default is
                    # off, meaning append to existing files
                    # in all cases.
log_rotation_age = 1d           # Automatic rotation of logfiles will
                    # happen after that time.  0 disables.
log_rotation_size = 0           # Automatic rotation of logfiles will
                    # happen after that much log output.
                    # 0 disables.

# These are relevant when logging to syslog:
#syslog_facility = 'LOCAL0'
#syslog_ident = 'postgres'

#silent_mode = off          # Run server silently.
                    # DO NOT USE without syslog or
                    # logging_collector
                    # (change requires restart)


# - When to Log -

#client_min_messages = notice       # values in order of decreasing detail:
                    #   debug5
                    #   debug4
                    #   debug3
                    #   debug2
                    #   debug1
                    #   log
                    #   notice
                    #   warning
                    #   error

#log_min_messages = warning     # values in order of decreasing detail:
                    #   debug5
                    #   debug4
                    #   debug3
                    #   debug2
                    #   debug1
                    #   info
                    #   notice
                    #   warning
                    #   error
                    #   log
                    #   fatal
                    #   panic

#log_min_error_statement = error    # values in order of decreasing detail:
                    #   debug5
                    #   debug4
                    #   debug3
                    #   debug2
                    #   debug1
                    #   info
                    #   notice
                    #   warning
                    #   error
                    #   log
                    #   fatal
                    #   panic (effectively off)

#log_min_duration_statement = -1    # -1 is disabled, 0 logs all statements
                    # and their durations, > 0 logs only
                    # statements running at least this number
                    # of milliseconds


# - What to Log -

#debug_print_parse = off
#debug_print_rewritten = off
#debug_print_plan = off
#debug_pretty_print = on
log_checkpoints = off
#log_connections = off
log_disconnections = off
log_duration = off
log_error_verbosity = default       # terse, default, or verbose messages
log_hostname = off
#log_line_prefix = ''           # special values:
                    #   %a = application name
                    #   %u = user name
                    #   %d = database name
                    #   %r = remote host and port
                    #   %h = remote host
                    #   %p = process ID
                    #   %t = timestamp without milliseconds
                    #   %m = timestamp with milliseconds
                    #   %i = command tag
                    #   %e = SQL state
                    #   %c = session ID
                    #   %l = session line number
                    #   %s = session start timestamp
                    #   %v = virtual transaction ID
                    #   %x = transaction ID (0 if none)
                    #   %q = stop here in non-session
                    #        processes
                    #   %% = '%'
                    # e.g. '<%u%%%d> '
log_lock_waits = off            # log lock waits >= deadlock_timeout
#log_statement = 'none'         # none, ddl, mod, all
#log_temp_files = -1            # log temporary files equal or larger
                    # than the specified size in kilobytes;
                    # -1 disables, 0 logs all temp files
#log_timezone = '(defaults to server environment setting)'


#------------------------------------------------------------------------------
# RUNTIME STATISTICS
#------------------------------------------------------------------------------

# - Query/Index Statistics Collector -

track_activities = on
track_counts = on
track_functions = none          # none, pl, all
track_activity_query_size = 1024    # (change requires restart)
update_process_title = on
stats_temp_directory = 'pg_stat_tmp'


# - Statistics Monitoring -

#log_parser_stats = off
#log_planner_stats = off
#log_executor_stats = off
#log_statement_stats = off


#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------

autovacuum = on         # Enable autovacuum subprocess?  'on'
                    # requires track_counts to also be on.
log_autovacuum_min_duration = -1    # -1 disables, 0 logs all actions and
                    # their durations, > 0 logs only
                    # actions running at least this number
                    # of milliseconds.
autovacuum_max_workers = 3      # max number of autovacuum subprocesses
                    # (change requires restart)
autovacuum_naptime = 1min       # time between autovacuum runs
autovacuum_vacuum_threshold = 50    # min number of row updates before
                    # vacuum
autovacuum_analyze_threshold = 50   # min number of row updates before
                    # analyze
autovacuum_vacuum_scale_factor = 0.2    # fraction of table size before vacuum
autovacuum_analyze_scale_factor = 0.1   # fraction of table size before analyze
autovacuum_freeze_max_age = 200000000   # maximum XID age before forced vacuum
                    # (change requires restart)
autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for
                    # autovacuum, in milliseconds;
                    # -1 means use vacuum_cost_delay
autovacuum_vacuum_cost_limit = -1   # default vacuum cost limit for
                    # autovacuum, -1 means use
                    # vacuum_cost_limit


#------------------------------------------------------------------------------
# CLIENT CONNECTION DEFAULTS
#------------------------------------------------------------------------------

# - Statement Behavior -

search_path = '"$user",public'      # schema names
default_tablespace = ''     # a tablespace name, '' uses the default
temp_tablespaces = ''           # a list of tablespace names, '' uses
                    # only default tablespace
check_function_bodies = on
default_transaction_isolation = 'read committed'
default_transaction_read_only = off
default_transaction_deferrable = off
session_replication_role = 'origin'
statement_timeout = 0           # in milliseconds, 0 is disabled
vacuum_freeze_min_age = 50000000
vacuum_freeze_table_age = 150000000
bytea_output = 'hex'            # hex, escape
xmlbinary = 'base64'
xmloption = 'content'

# - Locale and Formatting -

datestyle = 'iso, mdy'
#intervalstyle = 'postgres'
#timezone = '(defaults to server environment setting)'
#timezone_abbreviations = 'Default'     # Select the set of available time zone
                    # abbreviations.  Currently, there are
                    #   Default
                    #   Australia
                    #   India
                    # You can create your own file in
                    # share/timezonesets/.
#extra_float_digits = 0         # min -15, max 3
#client_encoding = sql_ascii        # actually, defaults to database
                    # encoding

# These settings are initialized by initdb, but they can be changed.
lc_messages = 'en_US.UTF-8'         # locale for system error message
                    # strings
lc_monetary = 'en_US.UTF-8'         # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'          # locale for number formatting
lc_time = 'en_US.UTF-8'             # locale for time formatting

# default configuration for text search
default_text_search_config = 'pg_catalog.english'

# - Other Defaults -

#dynamic_library_path = '$libdir'
#local_preload_libraries = ''


#------------------------------------------------------------------------------
# LOCK MANAGEMENT
#------------------------------------------------------------------------------

#deadlock_timeout = 1s
max_locks_per_transaction = 64      # min 10
                    # (change requires restart)
# Note:  Each lock table slot uses ~270 bytes of shared memory, and there are
# max_locks_per_transaction * (max_connections + max_prepared_transactions)
# lock table slots.
max_pred_locks_per_transaction = 64 # min 10
                    # (change requires restart)

#------------------------------------------------------------------------------
# VERSION/PLATFORM COMPATIBILITY
#------------------------------------------------------------------------------

# - Previous PostgreSQL Versions -

#array_nulls = on
#backslash_quote = safe_encoding    # on, off, or safe_encoding
#default_with_oids = off
#escape_string_warning = on
#lo_compat_privileges = off
#quote_all_identifiers = off
#sql_inheritance = on
#standard_conforming_strings = on
#synchronize_seqscans = on

# - Other Platforms and Clients -

#transform_null_equals = off


#------------------------------------------------------------------------------
# ERROR HANDLING
#------------------------------------------------------------------------------

exit_on_error = off             # terminate session on any error?
restart_after_crash = on            # reinitialize after backend crash?


#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------

custom_variable_classes = ''        # list of custom variable class names

And here is the pg_hba.conf file: 这是pg_hba.conf文件:

local   all             postgres                                trust

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
host    all             postgres             192.168.1.0/24         trust
host    all             all                  127.0.0.0/24          trust

I tried enable/disable autovacuum, disable logging etc. Not worked. 我尝试启用/禁用autovacuum,禁用日志记录等。没有工作。 M system has 8 CPU with 3GB memory and i have 1 TB dedicated space for this SQL server. M系统有8个CPU,3GB内存,我有1 TB专用空间用于这个SQL服务器。

Any idea and help is appreciated. 任何想法和帮助表示赞赏。

Note: This page does not solve my problem. 注意: 此页面无法解决我的问题。

Conclusion : Get PGPool-II 3.x. 结论 :获得PGPool-II 3.x. Very easy to setup (as mentioned in answer) and really fast! 很容易设置(如回答中提到的),真的很快!

Anecdotally MySQL has been to be be faster at establishing connections. 有趣的是,MySQL在建立连接方面要更快。 In environments like PHP where connections are being setup and torn down so fast, as opposed to longer running connections in an application environment such as Rails or the JVM. 在像PHP这样的环境中,连接的设置和拆卸速度如此之快,而不是在Rails或JVM等应用程序环境中运行更长时间的连接。

In this case it might make sense to use a connection pool for Postgres. 在这种情况下,为Postgres使用连接池可能是有意义的。 Two come to mind: 两个想到:

PGPool-II: http://www.pgpool.net/mediawiki/index.php/Main_Page PGPool-II: http ://www.pgpool.net/mediawiki/index.php/Main_Page

PgBouncer: http://pgfoundry.org/projects/pgbouncer/ PgBouncer: http ://pgfoundry.org/projects/pgbouncer/

I've used PGPool-II and its pretty easy to setup. 我使用过PGPool-II,它非常容易设置。

ummm.... I am no expert here, but wouldn't you want to bind your hba to a NIC or to localhost rather than to a network? 嗯....我不是这里的专家,但你不想将你的hba绑定到NIC或localhost而不是网络吗?

on a windows machine, 在Windows机器上,

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

how much RAM do you have? 你有多少RAM? how much virtual memory? 虚拟内存多少钱? if VM gets too big, it can slow down the machine. 如果VM太大,它可能会减慢机器速度。 but sometimes you just need it. 但有时你只需要它。

I don't know much about PostgreSQL, but I can tell you about why MySQL is fast for this particular query. 我对PostgreSQL了解不多,但我可以告诉你为什么MySQL对于这个特定的查询来说很快。

With InnoDB, primary key indexes are clustered indexes, which means that the pages are stored in the same physical order as the primary key. 使用InnoDB,主键索引是聚簇索引,这意味着页面以与主键相同的物理顺序存储。

Finally, when you are requesting ORDER BY DESC , MySQL simply reads the index backwards, so the performance is the same as ASC. 最后,当您请求ORDER BY DESC ,MySQL只是向后读取索引,因此性能与ASC相同。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM